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 дозволяє всебічно перевіряти помилки завдання, перевіряючи конкретні умови відмови, роблячи набори тестів більш надійними та допомагаючи розробникам забезпечити належну обробку помилок у своїх працівниках черги.