我有一个熟练的命令,可以触发一个名为 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);
}
}
答案 0 :(得分:1)
问题是您在作业运行后正在初始化间谍程序,这意味着在作业期间它将使用真实类而不是间谍程序。
您必须在测试中执行以下操作:
$spy = $this->spy(OrgRepository::class);
// run your job
$spy->shouldHaveReceived('forcePasswordReset');
我们告诉laravel使用间谍代替存储库,运行作业,然后断言该方法已被调用。
Jeffrey Way在this截屏视频中对此进行了很好的解释。