2012-12-14 34 views
1

代碼進行測試:如何使用PHPUnit測試此方法調用?

// Add the activation provider argument to the factory definition 
$factoryDefinition = $container->getDefinition('gremo_subscription_factory'); 
$factoryDefinition->addArgument(new Reference($providerId)); 

試驗方法應該檢查addArgument方法,包括$providerId說法。我只是learining PHPUnit的和現在我只能打電話給$this->anything()

$container->expects($this->at(3)) 
    ->method('getDefinition') 
    ->with('gremo_subscription_factory') 
    ->will($this->returnValue($factory)); 

$factory->expects($this->once()) 
    ->method('addArgument') 
    ->with($this->anything()); 

$this->pass->process($container); 

我如何檢查參數類型爲Reference類,以及(反過來)它的參數是完全串$providerId

+0

在新行上的分號看起來相當糟糕 – dynamic

+0

@llnk同意...有關該問題的任何幫助? – gremo

回答

2

這很複雜,尤其是因爲Reference類不是依賴注入方法調用不返回任何東西。不過,我認爲你可以使用argument constraints解決它。這是我會怎麼做,第二句話:

$factory->expects($this->once()) 
    ->method('addArgument') 
    ->with($this->logicalAnd(
     $this->isInstanceOf('Reference'), 
     $this->attributeEqualTo('attribute', $providerId) 
    )); 

logicalAnd()第二項基本上是檢查所創建,查看是否$providerId被正確分配(我不知道在發生什麼變化$providerIdReference對象構造函數爲Reference,但我假設它被保存到實例變量或其他東西)。

然而,這類事情正在進入測試Reference類實現細節的領域,所以像這樣的測試對維護SRP並不是很好。所有這些都可以通過重構代碼來更好地解決。一般來說,如果很難測試,可能不是測試套件的錯。如果你有能力,首先考慮改變事情,而不是寫出過於聰明的測試。

+0

謝謝。不幸的是,這段代碼在Symfony 2中很常見,並且無法避免新的'Reference'調用。不知道它的構造函數會如何處理我的價值,正如你所說的那樣並不重要,因爲我必須測試我的代碼。我會盡力回報... – gremo

+0

構造函數的作用並不重要,因爲你應該嘲笑整個事情。 $ this-> getMockBuilder('SomeClass') - > disableOriginalConstructor() - > getMock(); – jsteinmann

+0

@rockstarz:這沒有幫助。在這種情況下,不可能模擬Reference對象,因爲它不是依賴注入。 – theunraveler