我试图通过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);
你也可以设置它来控制它,用环境变量或其他东西来控制它,这样你就允许在正常使用期间模拟不存在的方法,但在持续集成运行等中阻止它。