【问题标题】: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() 方法,测试仍然通过... 为什么会这样?测试肯定会失败。

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

干杯

【问题讨论】:

    标签: php laravel mockery


    【解决方案1】:

    这就是默认情况下嘲弄的运作方式,我喜欢这种方式,因为它允许我一厢情愿地开发,即我希望我的UserRepository 接口有一个all 方法。

    你可以告诉 mockery 禁止它,这有点难看,但你可以把它放在你的测试引导文件中:

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

    您也可以设置它以使用环境变量或其他东西来控制它,因此您允许在正常使用期间模拟不存在的方法,但在您的持续集成运行等中阻止它。

    【讨论】:

    • 对 - 我正在尝试将测试添加到现有的代码库中,因此有点像“方法 X 需要方法 Y 才能正常运行,因此模拟类必须具有该方法”的想法。所以干杯,将实现这个!
    猜你喜欢
    • 2017-09-01
    • 2013-12-20
    • 2016-07-12
    • 2019-06-26
    • 2019-08-03
    • 2018-04-05
    • 2015-11-13
    • 2017-06-28
    • 2020-09-06
    相关资源
    最近更新 更多