Com a chegada do Laravel 13.35, a API de testes recebeu um aprimoramento significativo: as asserções de fakes – assertPushed, assertDispatched e assertSentTo – agora aceitam um array de valores esperados em vez de exigir um callback. Essa mudança reduz a verbosidade dos testes e elimina a necessidade de escrever funções anônimas para comparar propriedades de jobs, eventos ou notificações.
Na prática, o código de verificação passa de uma estrutura como:
Queue::assertPushed(ProcessPodcast::class,function (ProcessPodcast $job) use ($podcast,$user){
return $job->podcast->is($podcast) && $job->user->is($user) && $job->status==='pending';
});
para a forma compacta:
Queue::assertPushed(ProcessPodcast::class,[
'podcast'=>$podcast,
'user'=>$user,
'status'=>'pending',
]);
O mesmo padrão se aplica a Event::assertDispatched, Bus::assertDispatched e Notification::assertSentTo, inclusive nas versões negativas (assertNotPushed, assertNotDispatched, etc.). O array deve ser passado como segundo argumento, enquanto o nome da classe continua sendo o primeiro.
Quanto à comparação dos valores, cada chave do array precisa coincidir exatamente. A igualdade estrita (===) é usada, exceto quando os valores são modelos Eloquent: nesses casos a comparação ocorre via $model->is(), que verifica chave primária, tabela e conexão. Essa regra tem implicações para objetos como Carbon; duas instâncias com o mesmo instante não são iguais por identidade, portanto propriedades como 'scheduled_at'=>now() falharão e o desenvolvedor deverá recorrer a um callback customizado.
Existem restrições importantes: apenas propriedades públicas são lidas, de modo que jobs que utilizam propriedades protegidas ou getters ainda necessitam de callbacks. Não há suporte a notação de ponto para valores aninhados, e o array não pode ser usado com a variante de assertPushed que aceita apenas um closure tipado. A mudança foi contribuída por Jack Bayliss (pull request #61770) e documentada por Paul Redmond no Laravel News.
“O array simplifica testes ao eliminar callbacks repetitivos, mas requer atenção a propriedades públicas e tipos de dados.” – Paul Redmond, Laravel News
Fonte: Laravel News