嘲弄“应该接收”但方法不存在

Posted

技术标签:

【中文标题】嘲弄“应该接收”但方法不存在【英文标题】:Mockery "shouldReceive" yet method doesn't exist 【发布时间】:2015-01-26 07:36:56 【问题描述】:

我正在尝试使用 Laravel 更多地理解测试和嘲弄。我有一个存储库模式设置,我的控制器用户。我想测试我的基本getAllUsers()method:

public function test_get_all_users_method()

    $repo = Mockery::mock('Acme\Repositories\User\UserRepository');
    $repo->shouldReceive('all')->once()->andReturn('foo');

    $controller = new Acme\Controllers\Api\UserController($repo);
    $response = $controller->getComponents();

    $this->assertEquals('foo', $response);

据我了解,我在嘲笑我的 UserRepository,我希望我的 UserRepository 能够命中 all() 方法。这会返回一些虚拟数据,我希望在我的响应输出中看到这一点。

所以效果很好。 all() 方法存在于我的存储库的 Eloquent 实现中。但是,如果我删除 all() 方法,测试仍然通过... 为什么会这样?测试肯定会失败。

如果这是正常的,我很难理解为什么要这样测试我的控制器,因为我可以将任何旧方法名称传递给它,即使它存在与否。

干杯

【问题讨论】:

【参考方案1】:

这就是默认情况下嘲弄的运作方式,我喜欢这种方式,因为它允许我一厢情愿地开发,即我希望我的UserRepository 接口有一个all 方法。

你可以告诉 mockery 禁止它,这有点难看,但你可以把它放在你的测试引导文件中:

\Mockery::getConfiguration()->allowMockingNonExistentMethods(false);

您也可以设置它以使用环境变量或其他东西来控制它,因此您允许在正常使用期间模拟不存在的方法,但在您的持续集成运行等中阻止它。

【讨论】:

对 - 我正在尝试将测试添加到现有的代码库中,因此有点像“方法 X 需要方法 Y 才能正常运行,因此模拟类必须具有该方法”的想法。所以干杯,将实现这个!

以上是关于嘲弄“应该接收”但方法不存在的主要内容,如果未能解决你的问题,请参考以下文章

嘲弄和method_exists

嘲弄 shouldReceive()->once() 似乎不起作用

“方法存在但不满足特征界限”是啥意思?

方法存在但不满足以下特征界限(泛型)

删除桌面上有文件但提示项目不存在的方法

嘲弄模拟不返回指定值