Aquí podría ser tu PUBLICIDAD


ExpectedException no capta la excepción, pero puedo atraparlo con try catch

votos
2

¿Alguna idea sobre éste? Intento escribir una prueba unitaria que elimine un elemento y confirme que ese elemento ya no está en un repositorio tratando de recuperar el elemento por su ID, que debería arrojar una DataAccessException. Sin embargo, la prueba sigue fallando. Agregué un bloque de captura de prueba y, efectivamente, atrapé la excepción que esperaba. Estoy usando VS Test Tools para pruebas unitarias.

    [ExpectedException(typeof(DataAccessException))]
    private static void NHibernateRepositoryBaseDeleteHelper<T, TKey>(T myItem, TKey myItemId)
    {
        MyTestRepository<T, TKey> myRepository = new MyTestRepository<T, TKey>();
        myRepository.Delete(myItem);
        myRepository.CommitChanges();
        try
        {
            myRepository.GetById(myItemId, false);
        }
        catch (DataAccessException dae)
        {
            Assert.IsTrue(true);
        }
    }
Publicado el 12/03/2009 a las 19:07
fuente por usuario Justin Holbrook
En otros idiomas...        العربية       

3 respuestas

votos
5

Agregaré a lo que dijo Jared señalando que el atributo "ExpectedException" es una mierda. No hay forma de afirmar que el mensaje de la excepción es correcto (el parámetro "mensaje" no hace lo que crees que es) y no puedes verificar múltiples excepciones en una prueba.

Una mejor solución es hacer algo como esto: http://geekswithblogs.net/sdorman/archive/2009/01/17/unit-testing-and-expected-exceptions.aspx

Esa clase te permite hacer cosas geniales como esta:

[Método de prueba]
vacío público TestAFewObviousExceptions ()
{
// alguna configuración aquí
   ExceptionAssert.Throws ("Categoría 47 no existe", () => 
                wallet.Categories.GetChildCategoryIds (47));
   ExceptionAssert.Throws ("Id Flim no es válido", () => 
                wallet.Categories.IdFromName ("Flim"));
}
Respondida el 12/03/2009 a las 07:20
fuente por usuario mhenry1384


Aquí podría ser tu PUBLICIDAD


votos
4

Necesita agregar el atributo ExpectedException en el mismo método que tiene el atributo TestMethod. El marco de prueba de la unidad VS solo buscará un atributo ExpectedException en el punto de entrada de una prueba en particular.

[TestMethod]
[ExpectedException(typeof(DataAccessException))]
public void ATestMethod() {
  ...
  NHibernateRepositoryBaseDeleteHelper(itemValue, keyValue);
}
Respondida el 12/03/2009 a las 07:09
fuente por usuario JaredPar

votos
0

Primero estás derribando tu método de eliminación. Tendría un método de eliminación y un método de prueba por separado. Sí, está probando la eliminación, pero realmente está probando el comportamiento que está asociado con eliminar. Probablemente haya pruebas adicionales aquí.

Como esto es parte de lo que parece ser una prueba autogenerada, no agregaría al mismo objeto de depósito en esa prueba, pero realizaría mis pruebas en sus propios métodos de prueba y usaría la eliminación como parte de la configuración para la clase. Eso ciertamente separará la prueba de la eliminación.

Espero que esto ayude.

Respondida el 12/03/2009 a las 07:12
fuente por usuario Gregory A Beamer