¿Está bien agregar aserciones diferidas como esta?
var actualKittens = actualKittens.Select(kitten => {
Assert.IsСute(kitten);
return kitten
});
¿Por qué? Entonces puedo iterar solo una vez, incluso con declaraciones que esperan una colección materializada, por ejemplo:
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());
Y también podría ser no solo Select, sino un método con iterador definido y con muchas comprobaciones y lógica (por ejemplo, algunos contadores y filtros).
La semilla de la duda es la complejidad de leer y depurar dicho código en caso de que falle la prueba.
sequence.WithSideEffect(item => Assert.IsCute(item))
para hacerlo más limpio.expectedKittens
? Acabas de ocultar las iteraciones detrás de las llamadas a métodos..All()
.Respuestas:
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:
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 laAssert
que salió mal y será extremadamente difícil de depurar. Aquí hay un ejemplo: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.
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.
fuente
ToList
iterará lo enumerable, ¿no?Assert.Fail
sino en elCollectionAssert
y no podrá decir qué afirmación realmente salió mal. Quiero decir que VS no se enfocará enAssert.Fail
el otro ... ahora puedes depurar.