2014-09-19 62 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