这些是我的班级:
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()
方法有一个参数。
问题是:这样的工作还是我认为不好?
答案 0 :(得分:1)
withAnyParameters()
是默认值,这意味着参数没有特定的期望。它只是在测试时验证了正确的参数计数,但仅此而已。
在您的示例中,您具有正确的参数计数。
但是,对于我的示例,这看起来很好,因为参数是隐藏在 Car 中的硬编码字符串,因此这是一个不应进行单元测试的实现细节,因为它是透明的到公共界面。
因此,对于 Car 的公共接口的测试,此检查在技术上不是必需的(这听起来很自以为是)。那是因为模拟对象只是为了帮助测试对象。如果认为有必要对具体字符串进行此类检查,则应在操作的单元测试中对其进行测试,因为汽车仅是可以预期操作的消费者为真实世界的情况工作,可以更好地覆盖那里。
如果您仍想在 Car 的单元测试中测试该内部细节,您可以执行第一条评论中建议的操作,并使用具体参数值检查配置,此处为“{{ 1}}“:
go
这将使用该特定参数测试您对操作 run方法的预期调用。这很可能反映了您的意图,这对配置测试或测试内部结构非常有用(例如,通过 Car 记录完整性检查或记录操作对象的预期用途)。 / p>