Laravel Mock应该至少被调用一次但是被调用0次

时间:2019-12-03 10:31:00

标签: php laravel laravel-6 mockery phpunit-testing

我有一个熟练的命令,可以触发一个名为 PasswordResetJob 的作业,该作业在存储库类 OrgRepository 中调用方法 forcePasswordReset 时会进行迭代。方法更新用户表。整个过程运行良好。

现在,我正在尝试编写Laravel测试来模拟 OrgRepository 类,并断言 forcePasswordReset 方法至少被调用一次,这种情况应该是这样,根据我提供给测试的条件。在测试中,我叫工匠命令解雇工作; (我正在使用同步队列进行测试),因为可以直接查看我的数据库更新,因此在调用作业和更新用户表时,此方法工作正常。 但是,测试失败并显示以下错误: Mockery \ Exception \ InvalidCountException:应调用Mockery_2_Repositories_OrgRepository中的方法forcePasswordReset()  至少1次但被调用0次。

测试中的工匠电话是:

Artisan::call('shisiah:implement-org-password-reset');

在此模拟初始化之前和之后,我都尝试过进行artisan调用,但是我仍然遇到相同的错误。这是测试中的模拟初始化

$this->spy(OrgRepository::class, function ($mock) {
        $mock->shouldHaveReceived('forcePasswordReset');
    });

我想念什么?我浏览了文档,并在Google中搜索了几个小时。如果您需要任何其他信息来帮助您,请告诉我。我正在使用 Laravel 6.0版

编辑

我将 OrgRepository 类传递到作业类的 handle 方法中,如下所示:

 public function handle(OrgRepository $repository)
{
    //get orgs
    $orgs = Org::where('status', true)->get();

    foreach ($orgs as $org){
       $repository->forcePasswordReset($org);
    }
}

1 个答案:

答案 0 :(得分:1)

问题是您在作业运行后正在初始化间谍程序,这意味着在作业期间它将使用真实类而不是间谍程序。

您必须在测试中执行以下操作:

$spy = $this->spy(OrgRepository::class);

// run your job

$spy->shouldHaveReceived('forcePasswordReset');

我们告诉laravel使用间谍代替存储库,运行作业,然后断言该方法已被调用。

Jeffrey Way在this截屏视频中对此进行了很好的解释。