2015-09-03 41 views
1

我一直在測試,添加和刪除行以查看問題出在哪裏。我已經成功地削減這麼多線,基本上我的測試看起來像這樣的(當然,看看有什麼是錯的,我知道這是不是正確的測試):方法預計被稱爲1次,實際上稱爲0次[PHPUnit]

public function test() 
{ 
    $invoice = new Invoice(); 
    $invoiceRepository = $this 
      ->getMockBuilder('\Doctrine\ORM\EntityRepository') 
      ->disableOriginalConstructor() 
      ->getMock(); 
     $invoiceRepository->expects($this->once()) 
      ->method('findOneByNextNote') 
      ->will($this->returnValue($invoice)); 

     $invoiceRepository->findOneByNextNote(); 
} 

,仍然無法正常工作!我從標題得到一個錯誤:調用1周時間(s)時findOneByNextNote>:

預期失敗的方法名是等於 <字符串。方法預計 被稱爲1次,實際上被稱爲0次。

我錯過了什麼?

+0

我們不知道你錯過了什麼,但我們錯過了經過測試的代碼;) – lukelazarovic

+0

我不確切知道你的模擬框架是如何工作的,但是有了其他框架,你必須「開始」你的模擬。像'EasyMock.replay(mockObject)' – Joshua

+0

@lukelazarovic,但我的測試看起來像現在!並且仍然不工作。 – mmmm

回答

2

您可以指定要嘲笑(而不是滿級),該方法使類的行爲,所以淤泥只有要測試如下方法:

public function testFindOne() 
{ 
    $invoice = new Invoce(); 
    $invoiceRepository = $this 
     ->getMockBuilder('\Doctrine\ORM\EntityRepository') 
     ->setMethods(array('findOneByNextNote')) 
     ->disableOriginalConstructor() 
     ->getMock(); 
    $invoiceRepository->expects($this->once()) 
     ->method('findOneByNextNote') 
     ->will($this->returnValue($invoice)); 

    $invoiceRepository->findOneByNextNote(); 
} 

一個這樣的斷言如預期

希望這有助於

+1

@Matteo謝謝你,我改變了代碼,它幫助! – mmmm

+0

嗨@mmmm歡迎您! – Matteo

+0

爲什麼有人在沒有任何解釋的情況下倒下了?對於問題 – Matteo

2

你的斷言失敗,因爲EntityRepository做其實沒有叫findOneByNextNote的實現方法,因此它也不會被調用。

但是,實現了神奇的__call方法(並且調用findOneByNextNote將由PHP引擎的方法重載委託給該方法),因此您可以聲明調用此方法來修復您的斷言。

一個可能更好的解決方案是實際編寫一個具體的InvoiceRepository類(我建議即使是一個接口)與該特定的方法,並嘲笑這個類或接口。