NUnit espera excepciones


Tengo un conjunto de casos de prueba, algunos de los cuales se espera que arrojen excepciones. Debido a esto, he establecido los atributos para estas pruebas para esperar excepciones como así:

[ExpectedException("System.NullReferenceException")]

Cuando hago mis pruebas localmente todo está bien. Sin embargo, cuando muevo mis pruebas al servidor CI que ejecuta TeamCity, todas mis pruebas que tienen excepciones esperadas fallan. Este es un error conocido.

Soy consciente de que también existen los Assert.Throws<> y Assert.Throws métodos 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 probado algunas cosas, ninguna de las cuales parece funcionar para mí.

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

Author: SteveC, 2010-08-04

3 answers

No estoy seguro de lo que ha intentado que le está dando problemas, pero simplemente puede pasar una lambda como el primer argumento para Afirmar.Lanzar. Aquí está uno de uno de mis exámenes que pasa:

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

Bien, ese ejemplo puede haber sido un poco detallado. Supongamos que tenía una prueba

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

Que pasaría normalmente porque o.Foo() generaría una excepción de referencia nula.

Entonces dejaría el ExpectedException atributo y envolver su llamada a 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 delegado, para verificar que arroja una excepción en particular."La sintaxis () => DoSomething() representa un lambda, esencialmente un método anónimo. Así que en este caso, estamos diciendo Assert.Throws para ejecutar el fragmento o.Foo().

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

 69
Author: Mark Rushakoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-04 17:06:16

Aquí hay un ejemplo simple usando ambas maneras.

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 );
}
 8
Author: Jerod Houghtelling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-04 16:51:11

De forma predeterminada, TeamCity usa NUnit 2.2.10, que no tiene ExpectedException. Revisa los documentos de TeamCity "NUnit for NAnt" para ver cómo cambiarlo a algo más moderno, incluida la lista específica de versiones que TeamCity proporciona.

 2
Author: Ross Patterson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-02 13:12:29