2012-09-20 9 views
35

He estado luchando con esta, espero que ayude a otra persona.Clases marcadas con TestInitialize y TestCleanup sin ejecución

Si bien la creación de pruebas unitarias utilizando MSTEST descubrí que estaba repitiendo el mismo código en cada prueba, y se encontró un par de atributos prácticos (TestInitialize, TestCleanup, ClassInitialize y ClassCleanup).

Supuestamente, cuando marca un método con uno de estos atributos, debería ejecutarse automáticamente (antes de cada prueba, después de cada prueba, antes de todas las pruebas y después de todas las pruebas, respectivamente). Frustrante, esto no sucedió, y mis pruebas fallaron. Si llama directamente a estos métodos desde las clases marcadas con el atributo TestMethod, las pruebas tuvieron éxito. Era evidente que no se estaban ejecutando solos.

Aquí algunos ejemplos de código que estaba usando:

[TestInitialize()] 
private void Setup() 
{ 
    _factory = new Factory(); 
    _factory.Start(); 
} 

Por qué es esto no ejecutar?

Respuesta

84

El truco es hacer que estos métodos public:

[TestInitialize()] 
public void Setup() 
{ 
    _factory = new Factory(); 
    _factory.Start(); 
} 

Cuando están private que no se ejecutan.

+3

También no funcionarán si estático. – stuartdotnet

+0

@Stefan de Kok: Increíble que lo haya pasado por alto. ¡Gracias por la pista! – christoph

+1

También no funcionarán si son asíncronas. – andrew

9

TestInitialize y TestCleanup se ejecutan antes y después de todas las pruebas, no antes y después de cada una.

Eso está mal, ver, por ejemplo, este enlace: http://social.msdn.microsoft.com/Forums/en-US/vststest/thread/85fb6549-cbaa-4dbf-bc3c-ddf1e4651bcf

Ver también MSDN

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.classinitializeattribute.aspx

El código de ejemplo muestra cómo utilizar TestInitialize, ClassInitialize y AssemblyInitialize.

1

También tuve el problema y, debido a mi incomprensión de cómo se llaman los métodos, lo solucioné con esto: Haga que sus pruebas hereden de la clase que contiene los métodos TestInitialize y TestCleanup.

Cuestiones relacionadas