¿Está bien agregar afirmaciones diferidas como esta [..]
No lo es. ¿Por qué? Porque si por alguna razón elimina la segunda afirmación, la prueba aún se volvería verde y pensaría que todavía funciona, pero no funciona, ya que la colección no se enumerará. Si tiene dos o más afirmaciones independientes, seguirán haciendo su trabajo incluso si deshabilita una de ellas.
Considera esta combinación:
Assert.IsTrue(actualKittens.All(x => x.IsCute());
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());
Ahora, incluso si deshabilita o elimina una de las afirmaciones, la otra seguirá haciendo su trabajo. Además, si olvida materializar la colección, puede llevar más tiempo ejecutarla, pero seguirá funcionando. Las pruebas independientes son más robustas y confiables.
También hay un segundo no . No estoy seguro de cómo otros marcos lo manejan, pero si está utilizando la plataforma MS Test, entonces no sabría qué prueba falló. Si hace doble clic en la prueba fallida, le mostrará la CollectionAssert
falla, pero en realidad fue la anidada la Assert
que salió mal y será extremadamente difícil de depurar. Aquí hay un ejemplo:
[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());
}
Esto significa que la primera prueba es realmente inútil porque no ayuda a encontrar un error. No sabe si falló porque un número no era válido o porque ambas colecciones eran diferentes.
¿Por qué? Entonces puedo iterar solo una vez, incluso con declaraciones que esperan una colección materializada
Me pregunto por qué te importa. Estas son pruebas unitarias. No tiene que optimizar cada uno de ellos y, por lo general, las pruebas no requieren millones de elementos, por lo que el rendimiento no debería ser una preocupación.
Tendrá que mantener tales pruebas, ¿por qué debería hacerlas más complejas de lo necesario? Escribe afirmaciones simples que funcionen.
sequence.WithSideEffect(item => Assert.IsCute(item))
para hacerlo más limpio.