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
- Route::query() e i defaults() dei Model in Laravel 13.35
- Guarda il talk "Testing With Fakes" di Jason McCreary tenuto al Laracon
- Scopri come iniziare a fare testing in Laravel con semplici esempi usando PHPUnit e PEST
Jack Bayliss ha contribuito alla modifica nella PR #61770.
Altri articoli recenti
Laravel AI 1.1 e 1.2: Agent Skills, Cohere e structured output più solidi
Le release 1.1.0 e 1.2.0 di laravel/ai portano gli Agent Skills, l'approvazione obbligatoria per i tool built-in e nuovi provider come Cohere e Laya self-hosted. Sul fronte qualità arrivano i fix allo structured output per Bedrock e il supporto alle provider options. Aggiornati anche i modelli di default, con Claude 4.7+ che ignora i sampling params.
Laravel 13.35.0: scheduler più controllabile, code più flessibili e response Markdown
Laravel 13.35.0 porta Schedule::alwaysOnOneServer(), il supporto a schedule:interrupt per i comandi di lunga durata, --memory in percentuale per queue:work e il nuovo metodo markdown() sulla response factory. Tante piccole migliorie anche a test, view compilate in parallelo e dischi local.
BashBox: un interprete Bash in sandbox per agenti AI in PHP
BashBox è un interprete bash scritto in puro PHP che permette di eseguire gli script generati dagli agenti AI senza mai ricorrere a proc_open, exec o shell_exec. Ogni comando è una classe PHP che lavora su un filesystem virtuale, con limiti di esecuzione, quote disco e accesso di rete configurabili. Ideale per chi sviluppa agenti con il Laravel AI SDK o altre librerie simili.