2011-11-21 8 views
14

Tengo algunas pruebas en las que estoy comprobando el nombre del parámetro en la excepción. ¿Cómo escribo esto en MS TEST?Aserción de excepción de NUnit a MS TEST

ArgumentNullException exception = 
       Assert.Throws<ArgumentNullException>(
          () => new NHibernateLawbaseCaseDataLoader( 
               null, 
               _mockExRepository, 
               _mockBenRepository)); 

Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName); 

He estado esperando una forma más ordenada, así que puedo evitar el uso de try catch block en las pruebas.

Respuesta

29
public static class ExceptionAssert 
{ 
    public static T Throws<T>(Action action) where T : Exception 
    { 
    try 
    { 
     action(); 
    } 
    catch (T ex) 
    { 
     return ex; 
    } 

    Assert.Fail("Expected exception of type {0}.", typeof(T)); 

    return null; 
    } 
} 

Puede utilizar el método de extensión anterior como ayudante de prueba. Aquí está un ejemplo de cómo se usa:

// test method 
var exception = ExceptionAssert.Throws<ArgumentNullException>(
      () => organizations.GetOrganization()); 
Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName); 
+0

como su forma de trabajar alrededor de este – cpoDesign

+0

en su segundo bloque de código ¿no sería más correcto comprobar la excepción! = Nulo? – syclee

+0

Puede agregar otro bloque catch para el resto de las excepciones y decir: "Expected exception was abc but got xyz". – Hash

3

Dado que el atributo MSTest [ExpectedException] no marca el texto en el mensaje, su mejor opción es intentar ... capturar y establecer un Assert en la propiedad de excepción Message/ParamName.

7

Enchufe desvergonzado, pero me escribió un montaje simple que hace excepciones y mensajes de excepción que afirman un poco más fácil y más legibles en MSTest utilizando Assert.Throws() de sintaxis en el estilo de nUnit/xUnit.

Puede descargar el paquete desde Nuget usando: PM> Install-Package MSTestExtensions

O puede ver el código fuente completo aquí: https://github.com/bbraithwaite/MSTestExtensions

instrucciones de alto nivel, descargar el montaje y heredar de BaseTest y puede usar la sintaxis Assert.Throws().

El principal método para la aplicación Lanza se ve de la siguiente manera:

public static void Throws<T>(Action task, string expectedMessage, ExceptionMessageCompareOptions options) where T : Exception 
{ 
    try 
    { 
     task(); 
    } 
    catch (Exception ex) 
    { 
     AssertExceptionType<T>(ex); 
     AssertExceptionMessage(ex, expectedMessage, options); 
     return; 
    } 

    if (typeof(T).Equals(new Exception().GetType())) 
    { 
     Assert.Fail("Expected exception but no exception was thrown."); 
    } 
    else 
    { 
     Assert.Fail(string.Format("Expected exception of type {0} but no exception was thrown.", typeof(T))); 
    } 
} 

Más información here.

+0

@joran Debo añadir, espero su respuesta informativa a esta pregunta ... –

+0

No tengo nada que dar, ¡pero aprecio el suyo! Espero que no te hayas ofendado por mi comentario. Si bien mi experiencia en SO se basa en áreas temáticas completamente diferentes, intento retribuir al sitio editando cuando puedo y animando a personas como usted a que publiquen respuestas de mayor calidad. Todo se suma a un sitio que es un recurso mucho más valioso para los demás. – joran

+0

@joran Bastante bien :) –

Cuestiones relacionadas