Va bene aggiungere affermazioni differite come questa [..]
No , non lo è. Perché? Perché se per qualsiasi motivo rimuovete la seconda affermazione, il test diventerebbe ancora verde e pensereste che funzioni ancora ma non funziona poiché la raccolta non verrà enumerata. Se hai due o più affermazioni indipendenti, continueranno a fare il loro lavoro anche se ne disabiliti una.
Considera questa combinazione:
Assert.IsTrue(actualKittens.All(x => x.IsCute());
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());
Ora, anche se disabiliti o rimuovi uno degli asserzioni, l'altro farebbe comunque il suo lavoro. Inoltre, se ti dimentichi di materializzare la raccolta, potrebbe richiedere più tempo per l'esecuzione ma funzionerà comunque. I test indipendenti sono più robusti e affidabili.
C'è anche un secondo no . Non sono sicuro di come altri framework lo gestiscano, ma se si utilizza la piattaforma MS Test, non si saprebbe quale test non è riuscito. Se fai doppio clic sul test fallito ti mostrerà CollectionAssert
come fallito ma in realtà è stato il nidificato Assert
che è andato storto e sarà estremamente difficile eseguire il debug. Ecco un esempio:
[TestMethod]
public void TestMethod()
{
var numbers = new[] { 1, 2, 3 }.Select(x =>
{
Assert.Fail("Wrong number.");
return x;
});
// This will fail and you won't be sure why.
CollectionAssert.AreEqual(new[] { 1, 2, 3 }, numbers.ToList());
}
Ciò significa che il primo test è effettivamente inutile perché non aiuta a trovare un bug. Non sai se è fallito perché un numero non era valido o perché entrambe le raccolte erano diverse.
Perché? Quindi posso iterare solo una volta anche con dichiarazioni in attesa di una raccolta materializzata
Mi chiedo perché te ne importi? Questi sono test unitari. Non è necessario ottimizzarne ogni singolo bit e di solito i test non richiedono milioni di articoli, quindi le prestazioni non dovrebbero essere un problema.
Dovrai mantenere tali test, quindi perché dovresti renderli più complessi del necessario? Scrivi affermazioni semplici che funzionano.
sequence.WithSideEffect(item => Assert.IsCute(item))
per renderla più pulita.