根据Laravel文档,我可以使用Queue::fake();
防止工作排队。
尚不清楚如何测试(phpunit)在没有排队的情况下在工作类中使用几种方法。
例如:
class ActionJob extends Job
{
public $tries = 3;
protected $data;
public function __construct($data)
{
$this->data = $data;
}
public function handle()
{
if ($this->data['action'] == "deleteAllFiles") {
$this->deleteAllFiles();
}
}
protected function deleteAllFiles()
{
//delete all the files then return true
// if failed to delete return false
}
}
这是我要测试deleteAllFiles()
的示例 - 我需要模拟它吗?
使用假货的想法是它们是嘲笑的替代方法。所以,是的,如果您想嘲笑deleteAllFiles()
被称为,那么我不相信您可以使用假货。
但是,您可以断言作业中存在某个属性。
一件事,这不是您的示例,但请确保您的工作正在实现IlluminateContractsQueueShouldQueue
。
类似这样的东西
<?php
namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
class ActionJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 3;
public $data; // Make sure this public so you can access it in your test
public function __construct($data)
{
$this->data = $data;
}
public function handle()
{
if ($this->data['action'] == "deleteAllFiles") {
$this->deleteAllFiles();
}
}
protected function deleteAllFiles()
{
// do stuff
}
}
然后在您的测试中:
// ActionJobTest.php
Queue::fake();
// Do some things to set up date, call an endpoint, etc.
Queue::assertPushed(ActionJob::class, function ($job) {
return $job->data['action'] === 'deleteAllFiles';
});
如果您想在工作中断言$data
,则可以在关闭中进行其他状态并断言。
旁注:如果作业是Disptachable
,您也可以断言:
// ActionJobTest.php
Bus::fake();
// Do some things to set up date, call an endpoint, etc.
Bus::assertDispatched(ActionJob::class, function ($job) {
return $job->data['action'] === 'deleteAllFiles';
});