它如何与AnyArguments()方法一起使用?

时间:2017-06-16 15:20:06

标签: mocking phpunit

这些是我的班级:

class Car
{
    public function getStarted(Actions $actions)
    {
        $actions->run('go');
    }
}

/ ...

class Actions
{

    public function run($arg)
    {
        // ...
    }
}

我有这个测试:

$Car = new Car();
$ActionsMock = $this->createMock('Actions');

$Actions->expects($this->once())
                        ->method('run')
                        ->withAnyParameters()
                        ->willReturn('xy');

$Car->getStarted($Actions);

我没有收到错误,我是否致电withAnyArguments(),所以......应该给我错误,因为run()方法有一个参数。

问题是:这样的工作还是我认为不好?

1 个答案:

答案 0 :(得分:1)

withAnyParameters()是默认值,这意味着参数没有特定的期望。它只是在测试时验证了正确的参数计数,但仅此而已。

在您的示例中,您具有正确的参数计数。

但是,对于我的示例,这看起来很好,因为参数是隐藏在 Car 中的硬编码字符串,因此这是一个不应进行单元测试的实现细节,因为它是透明的到公共界面。

因此,对于 Car 的公共接口的测试,此检查在技术上不是必需的(这听起来很自以为是)。那是因为模拟对象只是为了帮助测试对象。如果认为有必要对具体字符串进行此类检查,则应在操作的单元测试中对其进行测试,因为汽车仅是可以预期操作的消费者为真实世界的情况工作,可以更好地覆盖那里。

如果您仍想在 Car 的单元测试中测试该内部细节,您可以执行第一条评论中建议的操作,并使用具体参数值检查配置,此处为“{{ 1}}“:

go

这将使用该特定参数测试您对操作 run方法的预期调用。这很可能反映了您的意图,这对配置测试或测试内部结构非常有用(例如,通过 Car 记录完整性检查或记录操作对象的预期用途)。 / p>