gpt4 book ai didi

laravel - 如何在 Laravel 中模拟 Job 对象?

转载 作者:行者123 更新时间:2023-12-03 08:31:28 25 4
gpt4 key购买 nike

当谈到 Laravel 中的队列测试时,我使用提供的 Queue Fake功能。但是,在某些情况下,我需要为 Job 类创建 Mock。

我有以下代码将作业推送到 Redis 支持的队列:

  $apiRequest->storeRequestedData($requestedData); // a db model
// try-catch block in case the Redis server is down
try {
App\Jobs\ProcessRunEndpoint::dispatch($apiRequest)->onQueue('run');
$apiRequest->markJobQueued();
} catch (\Exception $e) {
//handle the case when the job is not pushed to the queue
}

我需要能够测试 catch block 中的代码。因此,我尝试模拟 Job 对象,以便能够创建一个会抛出异常的伪造者。

我在单元测试中尝试过这个:

   ProcessRunEndpoint::shouldReceive('dispatch');

该代码返回:错误:调用未定义的方法 App\Jobs\ProcessRunEndpoint::shouldReceive()。我还尝试使用 $this->instance() 将作业实例与模拟对象交换,但效果不佳。

也就是说,如何测试 catch block 中的代码?

最佳答案

根据docs ,您应该能够通过为队列提供的模拟来测试作业。

Queue::assertNothingPushed();
// $apiRequest->storeRequestedData($requestedData);
// Use assertPushedOn($queue, $job, $callback = null) to test your try catch
Queue::assertPushedOn('run', App\Jobs\ProcessRunEndpoint::class, function ($job) {
// return true or false depending on $job to pass or fail your assertion
});

使 App\Jobs\ProcessRunEndpoint::dispatch($apiRequest)->onQueue('run'); 行抛出异常有点复杂。 dispatch() 仅返回一个对象,而 onQueue() 只是一个 setter。那里没有完成其他逻辑。相反,我们可以通过扰乱配置来使一切失败。

不要用Queue::fake();,而是用一个不起作用的驱动程序覆盖默认队列驱动程序:Queue::setDefaultDriver('this-driver-does-not-存在');这将使每个作业调度失败并抛出ErrorException

极简示例:

Route::get('/', function () {
try {
// Job does nothing, the handle method is just sleep(5);
AJob::dispatch();
return view('noError');
} catch (\Exception $e) {
return view('jobError');
}
});
namespace Tests\Feature;

use App\Jobs\AJob;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Facades\Queue;
use Tests\TestCase;

class AJobTest extends TestCase
{
/**
* @test
*/
public function AJobIsDispatched()
{
Queue::fake();

$response = $this->get('/');

Queue::assertPushed(AJob::class);

$response->assertViewIs('noError');
}

/**
* @test
*/
public function AJobIsNotDispatched()
{
Queue::setDefaultDriver('this-driver-does-not-exist');

$response = $this->get('/');

$response->assertViewIs('jobError');
}
}

关于laravel - 如何在 Laravel 中模拟 Job 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64956837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com