【问题标题】:How does it work withAnyArguments() method?它如何与 AnyArguments() 方法一起工作?
【发布时间】:2017-06-16 15:20:06
【问题描述】:

这些是我的班级:

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() 方法有一个参数。

问题是:像这样工作还是我觉得不好?

【问题讨论】:

标签: mocking phpunit


【解决方案1】:

withAnyParameters() 是默认值,表示对参数没有特定的期望。它在测试时仅验证参数的正确数量,仅此而已。

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

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

因此,对于 Car 的公共接口的测试,从技术上讲,这项检查是不必要的(这听起来很自以为是)。那是因为模拟对象只是为了辅助测试对象。如果认为有必要对具体字符串进行此类检查,则应在 Actions 的单元测试中对其进行测试,因为 Car 只是可以期待 Actions 的消费者 适用于现实世界的情况,并且可以在那里得到更好的覆盖。

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

$Actions
    ->expects($this->once())
    ->method('run')
    ->with('go') # <---
    ->willReturn('xy')
    ;

这将使用该特定参数测试您对 Actions 运行方法的预期调用。这很可能反映了您的意图,这对于配置测试或内部测试很有用(例如,完整性检查或记录 CarActions 对象的预期用法)。

【讨论】:

    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多