我试图用Laravel更多地了解Tests和Mockery。我有一个存储库模式设置,我的控制器用户。我想测试我的基本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()
方法。这会返回一些虚拟数据,我希望在我的响应输出中看到这一点。
这样可行。我的Eloquent实现存储库中存在all()
方法。但是,如果我删除all()
方法,测试仍会通过......为什么会这样?当然测试应该失败。
如果这是正常的,我很难理解为什么我会像这样测试我的控制器,因为我可以将任何旧方法名称传递给它,即使它存在与否。
干杯
答案 0 :(得分:3)
这就是默认情况下嘲讽的运作方式,我喜欢这种方式,因为它允许我通过一厢情愿的思维来发展,即我希望我的UserRepository
界面有一个all
方法。
你可以告诉嘲笑不允许它,它有点难看,但你可以把它放在你的测试引导程序文件中:
\Mockery::getConfiguration()->allowMockingNonExistentMethods(false);
您也可以将其设置为使用环境变量等控制它,因此您可以在正常使用期间模拟不存在的方法,但在持续集成运行等时阻止它。