2014-09-19 64 views
1

我在TestCase中有大量的測試。我想設置一個模擬對象,在大多數測試中返回相同的值,但在一些測試中,我想定製該值。如何重置對PHPUnit模擬對象的期望

我的想法是創建set_up()方法(我無法在自動調用的setUp()中設置期望值),並在每次測試開始時手動調用它。在這種方法中,我將設置默認返回值,然後在幾個需要自定義返回值的測試中,我會再次調用期望值,並希望覆蓋默認返回值。這不起作用,返回值不會被覆蓋。

下面是一個簡單的例子:

<?php 

class SomeClass { 
    function someMethod() { 
    } 
} 

class SomeTest extends PHPUnit_Framework_TestCase { 
    private $mock; 

    function set_up() { 
     $this->mock = $this->getMockBuilder('SomeClass') 
      ->disableOriginalConstructor() // This is necessary in actual program 
      ->getMock(); 
     $this->mock->expects($this->any()) 
      ->method('someMethod') 
      ->will($this->returnValue(1)); 
    } 

    function test() { 
     $this->set_up(); 

     $this->mock->expects($this->any()) 
      ->method('someMethod') 
      ->will($this->returnValue(2)); 

     $this->assertEquals(2, $this->mock->someMethod()); 
    } 
} 

看來,這應該是可能從閱讀How to reset a Mock Object with PHPUnit

PHPUnit mock with multiple expects() calls不回答我的問題。

我使用PHPUnit的4.2

回答

4

您可以將參數傳遞給方法SET_UP從而在需要時可配置模擬:

function set_up($someMethodReturnValue = 1) { 
    $mock = $this->getMockBuilder('SomeClass') 
     ->disableOriginalConstructor() // This is necessary in actual program 
     ->getMock(); 
    $mock->expects($this->any()) 
     ->method('someMethod') 
     ->will($this->returnValue($someMethodReturnValue)); 
    return $mock; 
} 


function test() { 
    $mock = $this->set_up(2); 
    $this->assertEquals(2, $this->mock->someMethod()); 
} 

可以進一步提高SET_UP()方法。如果有很多選項,最終你可以創建一個模擬創建類。

+0

謝謝,但我不想重複使用模擬,我只想覆蓋默認預期。我會在每個測試中調用'set_up()',以便測試之間不共享模擬。儘管將returnValue作爲參數傳遞是個好主意。 – bwroga 2014-09-19 15:57:23

+0

對,我說的問題不會發生。我會編輯答案。 – gontrollez 2014-09-19 16:04:01