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

¿Fue útil?

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top