2010-01-11 16 views
5

Digamos que tenemos un método que tiene este aspecto:C#, NUnit: ¿Cómo lidiar con las pruebas de las excepciones y de ejecución diferida

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()); 

El prueba fallará diciendo que

esperado: <System.ArgumentNullException>
Pero era: null

lo puedo arreglar cambiando la prueba para

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 el no-construido en Select método, y fracasó incluso sin un ToArray ni nada de eso, por lo que al parecer no es algo que se pueda hacer al respecto ... acabo de hacer saber qué: p

Respuesta

3

La prueba está bien - su código no 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(); 
} 
+0

Aaaah, así que por eso todos los métodos que se parecen en esa biblioteca de los suyos ... tiene sentido! Aunque no estoy seguro si me gusta ... jeje. Debo decir que prefiero mantenerlo en un método. Pero, oh, bueno. Supongo que me acostumbraré después de un tiempo :) – Svish

+1

Es un desafortunado efecto secundario de los bloques del iterador. Consulte http://msmvps.com/blogs/jon_skeet/archive/2008/03/02/c-4-idea-iterator-blocks-and-parameter-checking.aspx –

+0

Exactamente. Sí, entendí por qué sucedió. Simplemente no cómo la forma recomendada de tratar con eso fue :) – Svish

Cuestiones relacionadas