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


Mockery "shouldReceive" yet method doesn't exist

我试图通过Laravel更多地理解测试和嘲弄。我有一个存储库模式设置,我的控制器用户。我想测试我的基本getAllUsers()方法:

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()方法存在于我的存储库的雄辩实现中。但是,如果我删除all()方法,测试仍然通过...为什么会这样?当然,测试应该失败。

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

干杯

这就是嘲弄默认的运作方式,我喜欢这样,因为它允许我通过一厢情愿的想法进行开发,即我希望我的UserRepository界面有一个all的方法。

你可以告诉嘲笑不允许它,它有点丑陋,但你可以把它放在你的测试引导文件中:

'Mockery::getConfiguration()->allowMockingNonExistentMethods(false);
你也可以设置它来控制它,

用环境变量或其他东西来控制它,这样你就允许在正常使用期间模拟不存在的方法,但在持续集成运行等中阻止它。