Mockery" shouldReceive"但方法并不存在

时间:2014-11-27 16:29:46

标签: php laravel mockery

我试图用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()方法,测试仍会通过......为什么会这样?当然测试应该失败。

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

干杯

1 个答案:

答案 0 :(得分:3)

这就是默认情况下嘲讽的运作方式,我喜欢这种方式,因为它允许我通过一厢情愿的思维来发展,即我希望我的UserRepository界面有一个all方法。

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

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

您也可以将其设置为使用环境变量等控制它,因此您可以在正常使用期间模拟不存在的方法,但在持续集成运行等时阻止它。