2010-08-04 12 views
34

Tengo un conjunto de casos de prueba, algunos de los cuales arrojan excepciones. Debido a esto, he he puesto los atributos para estas pruebas esperar excepciones de esta manera:NUnit esperaba excepciones

[ExpectedException("System.NullReferenceException")] 

Cuando ejecuto mis pruebas localmente todo es bueno. Sin embargo, cuando paso mis pruebas al servidor de CI que ejecuta TeamCity, todas mis pruebas que tienen excepciones esperadas fallan. Este es un error conocido.

Soy consciente de que también están los métodos Assert.Throws<> y Assert.Throws que ofrece NUnit.

Mi pregunta es ¿cómo puedo hacer uso de estos en lugar del atributo que estoy usando actualmente?

He echado un vistazo a StackOverflow y he intentado algunas cosas, pero ninguna de ellas parece funcionar para mí.

¿Hay una solución simple de 1 línea para usar esto?

Respuesta

62

No estoy seguro de lo que ha intentado que le está causando problemas, pero simplemente puede pasar una lambda como primer argumento para Assert.Throws. Aquí está uno de uno de mis pruebas que pasa:

Assert.Throws<ArgumentException>(() => pointStore.Store(new[] { firstPoint })); 

bien, ese ejemplo puede haber sido un poco más detallado. Supongamos que tenía una prueba

[Test] 
[ExpectedException("System.NullReferenceException")] 
public void TestFoo() 
{ 
    MyObject o = null; 
    o.Foo(); 
} 

que pasaría normalmente debido o.Foo() elevaría una excepción de referencia nula.

A continuación, descartaría el atributo ExpectedException y ajustaría su llamada al o.Foo() en un Assert.Throws.

[Test] 
public void TestFoo() 
{ 
    MyObject o = null; 
    Assert.Throws<NullReferenceException>(() => o.Foo()); 
} 

Assert.Throws "intenta invocar un fragmento de código, representado como un delegado, con el fin de verificar que se lanza una excepción en particular." La sintaxis () => DoSomething() representa un lambda, esencialmente un método anónimo. Entonces, en este caso, le estamos diciendo al Assert.Throws que ejecute el fragmento o.Foo().

Así que no, no solo agrega una sola línea como lo hace con un atributo; debe envolver explícitamente la sección de su prueba que lanzará la excepción, en una llamada al Assert.Throws. Usted no necesariamente tiene que usar un lambda, pero a menudo es el más conveniente.

+0

No estoy seguro de qué es todo esto() => pointStore.Store (new [] {firstPoint}). ¿No hay una sola línea que pueda poner en mi función de prueba? – Martin

+0

Gracias por la información adicional Mark, me ayudó a dejarlo muy claro, ¡gracias! – Martin

+0

¡Gracias! Solucionó mi problema. Además, si o.Foo es aguardable, debe usar 'Assert.Throws (async() => await o.Foo())' en su lugar. – CrazyRussianCoder

6

Aquí hay un ejemplo simple en ambos sentidos.

string test = null; 
Assert.Throws(typeof(NullReferenceException),() => test.Substring(0, 4)); 
Assert.Throws<NullReferenceException>(() => test.Substring(0, 4)); 

Si no desea utilizar lambdas.

[Test] 
public void Test() 
{ 
    Assert.Throws<NullReferenceException>(_TestBody); 
} 

private void _TestBody() 
{ 
    string test = null; 
    test.Substring(0, 4); 
} 
2

Por defecto, TeamCity utiliza NUnit 2.2.10, que no tiene ExpectedException. Consulte los documentos "NUnit for NAnt" de TeamCity para ver cómo cambiarlo a algo más moderno, incluida la lista específica de lanzamientos que proporciona TeamCity.