C #, NUnit: ¿Cómo lidiar con las pruebas de las excepciones y ejecución diferida
-
19-09-2019 - |
Pregunta
Supongamos que tenemos un método que tiene este aspecto:
public IEnumerable<Dog> GrowAll(this IEnumerable<Puppy> puppies)
{
if(subjects == null)
throw new ArgumentNullException("subjects");
foreach(var puppy in puppies)
yield return puppy.Grow();
}
Si pruebo que al hacer esto:
Puppy[] puppies = null;
Assert.Throws<ArgumentNullException>(() => puppies.GrowAll());
La prueba fallará diciendo que
esperado:
<System.ArgumentNullException>
Pero fue:null
Puedo arreglar que al cambiar la prueba a
Puppy[] puppies = null;
Assert.Throws<ArgumentNullException>(() => puppies.GrowAll().ToArray());
Es esto lo que se suele hacer? ¿O hay una mejor manera de escribir la prueba? O tal vez una mejor manera de escribir el método en sí?
tratado de hacer lo mismo con la incorporada en el método Select
, y fracasó incluso sin un ToArray
ni nada de eso, por lo que al parecer no es algo que se pueda hacer al respecto ... yo no sé qué: p
Solución
La prueba está muy bien - el código no lo es. Usted debe hacer que el código iniciar la excepción tan pronto como se le llama, dividiendo el método en el medio:
public IEnumerable<Dog> GrowAll(this IEnumerable<Puppy> puppies)
{
if(subjects == null)
throw new ArgumentNullException("subjects");
return GrowAllImpl(puppies);
}
private IEnumerable<Dog> GrowAllImpl(this IEnumerable<Puppy> puppies)
{
foreach(var puppy in puppies)
yield return puppy.Grow();
}