设置 PHPUnit Mock 后,是否可以更改该方法?

2022-08-30 13:44:21

我正在尝试在 setUp 中创建一个模拟实例,其中包含所有被覆盖方法的默认值,然后在几个不同的测试中,根据我正在测试的内容更改某些方法的返回值,而无需设置整个 Mock。有没有办法做到这一点?

这就是我尝试过的,但幼稚的方法不起作用。该方法仍返回原始期望设置中的值。

首次设置:

$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稍后更改期望,但那个人没有得到任何回应,我认为一个新问题可能会把这个问题放在首位。


答案 1

如果多次使用相同的方法,则应在代码中执行的位置使用具有适当计数的“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');
    }

我想这就是你要找的,但是如果我有误解,请告诉我。

现在,就模拟任何东西而言,您可以根据需要多次模拟它,但是您不会想要使用与设置中相同的名称来模拟它,否则每次使用它时,您都是指设置。如果需要在不同的场景中测试类似的方法,请针对每个测试进行模拟。您可以在设置中创建一个模拟,但对于一个测试,使用单个测试中类似项的不同模拟,但不能使用全局名称。


答案 2

您可以使用 lambda 回调执行此操作:

$one_of_many_methods_return = true;
$my_mock->expects($this->any())
        ->method('one_of_many_methods')
        ->will(
             $this->returnCallback(
                 function () use (&$one_of_many_methods_return) {
                     return $one_of_many_methods_return;
                 }
              )         
          );
$this->assertTrue($my_mock->one_of_many_methods());

$one_of_many_methods_return = false;

$this->assertFalse($my_mock->one_of_many_methods());    

请注意语句中的 。&use


推荐