作业类中的测试功能

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 建议

以上是关于作业类中的测试功能的主要内容,如果未能解决你的问题,请参考以下文章

作业三 功能测试

第三次作业-功能测试

第三次作业_03功能测试

团队作业8——测试与发布(Beta阶段)

团队作业8——测试与发布(Beta阶段)

第六周作业