作业类中的测试功能
Posted
技术标签:
【中文标题】作业类中的测试功能【英文标题】:Test functionality in the Job Class 【发布时间】:2018-03-12 09:42:21 【问题描述】:我喜欢测试(通过 phpunit 进行功能测试)作业类(流明队列)中的一些方法,以确保它正常工作。
问题是作业类有一些作业方法,例如$this->job->getJobId()
和$this->release(5);
如果我从控制台运行 phpunit,我会得到一个错误:
错误:在 null 上调用成员函数 getJobId()
测试代码如下:
/**
* @test
*/
public function it_has_successfully_uploaded()
$job = new SomeJob(['file' => ['file1.zip']]);
$job->handle();
我该如何解决这个问题?
【问题讨论】:
你能显示你的工作的来源和异常的完整堆栈跟踪吗? @sisve 剥离版本看起来像 kopy.io/D9maN - 使用dispatch()
没有问题,但是通过 phpunit 进行测试会导致问题,因为我正在创建 SomeJob
对象,所以我可以测试而不是比使用dispatch()
【参考方案1】:
您的代码正在使用$this->job->getJobId()
,但没有声明或设置该属性。您是否可能使用了 InteractsWithQueue 特征,但忘记将其包含在代码粘贴中?
如果是这样,则在InteractsWithQueue::setJob 中设置作业属性。可以从多个地方调用此方法,但在您的情况下,它可能来自Illuminate\Queue\CallQueuedHandler::setJobInstanceIfNecessary。这是 Laravel 为你做的工作的一些内部初始化,你必须在测试设置中模仿。
我将实现Illuminate\Contracts\Queue\Job 的简化版本并在调用$job->handle()
之前调用$job->setJob(new SimplisticVersionShazaamJob(...));
。
【讨论】:
InteractsWithQueue
已经包含在 Lumen 的 Job
抽象类中。 github.com/laravel/lumen/blob/master/app/Jobs/Job.php
@I'll-Be-Back 那么为什么它之前被标记为 Laravel 5.5 而你谈到了 Laravel?
@MarcinNabiałek 我的错误。甚至 InteractsWithQueue
也已包含在内 - 它不能解决问题。所以我现在正在使用$job->setJob()
测试@sisve 建议以上是关于作业类中的测试功能的主要内容,如果未能解决你的问题,请参考以下文章