2013-02-24 106 views
2

我正在爲Symfony w/PHPUnit編寫功能測試,而我的嘲笑不起作用。我可能誤解了他們的工作方式。Symfony/PHPUnit模擬服務

在我的單元測試的setUp()方法我有這樣的代碼:

... 
// Create a stub 
$stub = $this->getMockBuilder('\\ApiBundle\\Util\\WordPressBridge') 
    ->disableOriginalConstructor() 
    ->getMock(); 

// Configure the stub. 
$user = new WordPressUser(); 
$user->setUsername('dummy'); 
$stub->expects($this->any()) 
    ->method('checkCredentials') 
    ->will($this->returnValue(true)); 
$stub->expects($this->any()) 
    ->method('getUser') 
    ->will($this->returnValue($user)); 
... 

在我的symfony應用程序,我定義的服務:

services: 
    api.wp_bridge: 
     class: ApiBundle\Util\WordPressBridge 
     arguments: [@service_container] 

這是我的理解是,模擬應更換real WordPressBridge,但那不是發生了什麼事情。我的原稿仍在使用中。我錯過了什麼嗎?

+0

「功能單元測試」一些「驗收標準」的東西是一個矛盾。 – 2013-02-24 18:43:59

回答

3

這是我的理解是模擬應該取代真正的WordPressBridge,但這不是發生了什麼事情。我的原稿仍在使用中。我錯過了什麼嗎?

基本上你必須在Symfony容器中以某種方式替換你的服務。

如果你在做「功能測試」,那麼你可能應該爲「測試」 env創建測試「虛擬」服務,它將覆蓋原來的一個。你可以做這樣的事情:

的src/YourBundle /資源/配置/ services.yml

services: 
    api.wp_bridge: 
     class: %api.wp_bridge.class% 
     arguments: [@service_container] 

應用程序/配置/ config.yml

parameters: 
    api.wp_bridge.class: "ApiBundle\Util\WordPressBridge" 

app/config/config_test.yml

parameters: 
    api.wp_bridge.class: "ApiBundle\Util\TestWordPressBridge" 

然後功能測試將使用 「ApiBundle \的Util \ TestWordPressBridge」 - 因爲它是在「測試」 ENV執行。

你可以嘗試模擬容器,並通過它來測試內核,但是這可能是沒有一些其他的嘲諷LIB不好受(純PHPUnit的)。

個人我使用phpspec2爲「單位」的測試,這時嘲諷也就不難:)和我使用behatmink