php - 设置 PHPUnit Mock 后,我可以更改方法吗?

标签 php mocking phpunit

我试图在 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/

相关文章:

javascript - 从 url 连续获取数据

java - 部分模拟子类的方法使其绕过父类(super class)构造函数

javascript - sinon模拟不接听电话

python - 使用 ImageField 的 Django 测试模型

yii2 - 调用未定义的函数 tests\codeception\unit\models\expect()

php - pdf封面制作

php - Apache 上的空白 PHP 页面

php - 如何操作和整理关联数组中的数据

PHPUnit assertEquals 严格类型检查

PHPUnit equalTo 日期与 delta