嘲弄“应该接收”但方法不存在
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 才能正常运行,因此模拟类必须具有该方法”的想法。所以干杯,将实现这个!以上是关于嘲弄“应该接收”但方法不存在的主要内容,如果未能解决你的问题,请参考以下文章