我试图在 setUp 中为所有被覆盖的方法创建一个具有默认值的模拟实例,然后在几个不同的测试中根据我正在测试的内容更改某些方法的返回值,而无需设置整个模拟。有办法做到这一点吗?
这是我尝试过的方法,但是天真的方法不起作用。该方法仍然返回原始期望设置的值。
第一次设置:
$my_mock->expects($this->any())
->method('one_of_many_methods')
->will($this->returnValue(true));
在另一个断言之前的另一个测试中:
$my_mock->expects($this->any())
->method('one_of_many_methods')
->will($this->returnValue(false));
重复这个问题:PHPUnit Mock Change the expectations later , 但那个没有得到回应,我认为一个新问题可能会使问题脱颖而出。
最佳答案
如果多次使用同一方法,则应在代码中使用带有正确计数的“at”声明。这样 PHPUnit 就知道您指的是哪一个,并且可以正确地实现期望/断言。
以下是一个通用示例,其中方法“run”被多次使用:
public function testRunUsingAt()
{
$test = $this->getMock('Dummy');
$test->expects($this->at(0))
->method('run')
->with('f', 'o', 'o')
->will($this->returnValue('first'));
$test->expects($this->at(1))
->method('run')
->with('b', 'a', 'r')
->will($this->returnValue('second'));
$test->expects($this->at(2))
->method('run')
->with('l', 'o', 'l')
->will($this->returnValue('third'));
$this->assertEquals($test->run('f', 'o', 'o'), 'first');
$this->assertEquals($test->run('b', 'a', 'r'), 'second');
$this->assertEquals($test->run('l', 'o', 'l'), 'third');
}
我认为这就是您要查找的内容,但如果我有误解,请告诉我。
现在就模拟任何东西而言,您可以根据需要多次模拟它,但您不会想要使用与设置中相同的名称来模拟它,否则每次使用它时您都指的是设置。如果您需要在不同的场景中测试类似的方法,那么为每个测试模拟它。您可以在设置中创建一个模拟,但对于一个测试,在单个测试中使用类似项目的不同模拟,而不是全局名称。
关于php - 设置 PHPUnit Mock 后,我可以更改方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13631855/