Laravel представляет метод assertFailedWith для более точного тестирования сбоев заданий в очереди, позволяя разработчикам точно проверять, как и почему задания терпят неудачу, а не просто подтверждать произошедший сбой.
Метод assertFailedWith поддерживает несколько типов утверждений для комплексного тестирования сбоев заданий:
use App\Jobs\ProcessDocument;
use App\Exceptions\ProcessingException;
$job = (new ProcessDocument)->withFakeQueueInteractions();
// Test with message
$job->assertFailedWith('processing failed');
// Test with exception class
$job->assertFailedWith(ProcessingException::class);
// Test with exception instance
$job->assertFailedWith(new ProcessingException);
// Test with specific message
$job->assertFailedWith(new ProcessingException(message: 'invalid format'));
// Test with message and code
$job->assertFailedWith(new ProcessingException(message: 'timeout error', code: 408));
Его также можно использовать для тестирования интеграции с внешними службами:
class ExternalServiceJobTest extends TestCase
{
public function test_api_sync_handles_rate_limiting()
{
Http::fake(['*' => Http::response([], 429)]);
$job = new SyncExternalDataJob($apiEndpoint)
->withFakeQueueInteractions();
$job->handle();
$job->assertFailedWith(
new RateLimitException('API rate limit exceeded', 429)
);
}
public function test_webhook_delivery_handles_invalid_endpoint()
{
$job = new DeliverWebhookJob('invalid-url', $payload)
->withFakeQueueInteractions();
$job->handle();
$job->assertFailedWith(
new InvalidEndpointException('Invalid webhook URL format')
);
}
}
Метод assertFailedWith позволяет проводить всестороннее тестирование сбоев заданий, проверяя определенные условия сбоя, делая наборы тестов более надежными и помогая разработчикам обеспечить надлежащую обработку ошибок в своих рабочих очередях.