notiziephp.it

Le fake assertion di Laravel ora accettano array di proprietà

Traduzione da Laravel News
7 Ottobre 2026 Tempo di lettura: 3 minuti
Le fake assertion di Laravel ora accettano array di proprietà

Verificare quale job è stato accodato, o quale evento o notifica è stata inviata, di solito significa scrivere una callback che confronti ogni singola proprietà. A partire da Laravel 13.35, i fake di Queue, Bus, Event e Notification accettano un array di valori di proprietà attesi al posto di quella callback.

Prima e dopo

Prendiamo il test di un upload di podcast che accoda un job ProcessPodcast. Prima della 13.35, verificare le proprietà del job richiedeva una callback:

Queue::fake();

$this->actingAs($user)->post('/podcasts', $data);

Queue::assertPushed(ProcessPodcast::class, function (ProcessPodcast $job) use ($podcast, $user) {
return $job->podcast->is($podcast)
&& $job->user->is($user)
&& $job->status === 'pending';
});

Con la 13.35, i valori attesi vanno in un array:

Queue::assertPushed(ProcessPodcast::class, [
'podcast' => $podcast,
'user' => $user,
'status' => 'pending',
]);

Gli altri fake funzionano allo stesso modo:

Event::assertDispatched(OrderShipped::class, ['order' => $order]);

Bus::assertDispatched(GenerateInvoice::class, ['order' => $order]);

Notification::assertSentTo($user, InvoicePaid::class, ['invoice' => $invoice]);

L'array funziona anche con le assertion negative e con le varianti che accettano una callback, come assertNotPushed(), assertPushedOn(), assertNotDispatched() e assertNotSentTo():

Queue::assertNotPushed(ProcessPodcast::class, ['user' => $otherUser]);

Passa il nome della classe come primo argomento. L'array non può essere usato con la forma di assertPushed() che accetta soltanto una closure tipizzata.

Come vengono confrontati i valori

Ogni chiave presente nell'array deve corrispondere perché l'assertion passi. Ogni valore viene confrontato con uguaglianza stretta (===), con una sola eccezione: quando il valore atteso e quello effettivo sono entrambi modelli Eloquent, vengono confrontati con $model->is(), che verifica chiave primaria, tabella e connessione.

L'uguaglianza stretta ha delle conseguenze per gli altri oggetti. Due istanze di Carbon riferite allo stesso momento sono oggetti diversi, quindi 'scheduled_at' => now() fallisce. Usa una callback quando devi confrontare date, value object o collection:

Queue::assertPushed(SendReminder::class, function (SendReminder $job) use ($user) {
return $job->user->is($user)
&& $job->sendAt->equalTo(now()->addDay());
});

L'array verifica soltanto le proprietà di primo livello, quindi non esiste una dot notation per i valori annidati.

Solo proprietà pubbliche

Il fake legge ogni proprietà dall'esterno dell'oggetto, quindi le proprietà devono essere pubbliche. Un job che conserva i propri dati in proprietà protected, o dietro metodi getter, ha ancora bisogno di una callback. La property promotion nel costruttore con public funziona:

class ProcessPodcast implements ShouldQueue
{
use Queueable;

public function __construct(
public Podcast $podcast,
public User $user,
public string $status = 'pending',
) {}
}

Una chiave che non esiste sull'oggetto fa fallire l'assertion invece di lanciare un errore, così un refuso nel nome di una proprietà si manifesta come un test fallito.

Per approfondire

Jack Bayliss ha contribuito alla modifica nella PR #61770.

Condividi su: LinkedIn

Altri articoli recenti