2012-04-15 25 views
9

我有一個簡單的用例。我想有一個設置方法,這將導致我的模仿對象返回默認值:PHPUnit Mock稍後改變預期

$this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(true)); 

但隨後一些測試,我想返回不同的值:

$this->myservice 
     ->expects($this->exactly(1)) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(false)); 

我過去我曾經使用過GoogleMock for C++,它有「returnByDefault」或其他的東西來處理它。我無法弄清楚PHPUnit中是否可以這樣做(沒有api文檔,代碼很難通過閱讀來找到我想要的)。

現在,我不能只是將$this->myservice更改爲新的模擬,因爲在設置中,我將它傳遞給其他需要嘲笑或測試的東西。

我唯一的其他解決方案是我失去了設置的好處,而不得不建立我所有的嘲笑爲每個測試。

回答

2

您可以將setUp()代碼移動到另一個具有參數的方法中。這個方法從setUp()開始調用,你也可以從你的測試方法調用它,但參數與默認的不同。

+1

這怎麼解決這個問題?無論如何,'setUp()'方法將被調用 – 2015-04-03 07:49:08

+0

@MassimilianoArione是的,但是你可以重新創建你的'$ this-> myservice'並改變返回值 – rndstr 2016-01-29 13:14:47

0

繼續建立模擬在setUp()但在每個測試單獨設置的期望:因爲PHPUnit的實例FooTest的新實例運行每個測試

class FooTest extends PHPUnit_Framework_TestCase { 
    private $myservice; 
    private $foo; 
    public function setUp(){ 
    $this->myService = $this->getMockBuilder('myservice')->getMock(); 
    $this->foo = new Foo($this->myService); 
    } 


    public function testUniqueThing(){ 
    $this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(true)); 

    $this->assertEqual('baz', $this->foo->calculateTheThing()); 
    } 

    public function testNonUniqueThing(){ 
    $this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(false)); 

    $this->assertEqual('bar', $this->foo->calculateTheThing()); 

    } 


} 

兩個預期不會互相干擾。