2009-02-14 11 views
7

Si tengo el siguiente código:¿Configurar en clases derivadas con NUnit?

[TestFixture] 
public class MyBaseTest 
{ 
    protected ISessionManager _sessionManager; 

    [SetUp] 
    public void SetUp() { /* some code that initializes _sessionManager */ } 
} 

[TestFixture] 
public class MyDerivedTest : MyBaseTest 
{ 
    IBlogRepository _repository; 

    [SetUp] 
    public void SetUp() { /* some code that initializes _repository */ } 

    [Test] 
    public void BlogRepository_TestGoesHere() { /* some tests */ } 
} 

... NUnit no llamar a la rutina de instalación de base. Esto es esperado, y no tengo ningún problema con él en sí mismo. Puedo conseguir el programa de instalación derivados de llamar a la instalación básica de primera, así:

[TestFixture] 
public class MyDerivedTest : MyBaseTest 
{ 
    IBlogRepository _repository; 

    [SetUp] 
    public new void SetUp() 
    { 
     base.SetUp(); 
     /* some code that initializes _repository */ 
    } 

Ésta es feo. Si fuera un constructor, no tendría que hacerlo.

que podría utilizar el patrón "método de la plantilla", y tienen la siguiente:

public void MyBaseTest 
{ 
    abstract void SetUp(); 

    [SetUp] 
    public void BaseSetUp() 
    { 
     /* base initialization */ 
     SetUp(); // virtual call 
    } 
} 

No soy especialmente aficionado a esto, tampoco.

¿Qué haces cuando sus clases de prueba necesitan SetUp, y se derivan de otra clase que también necesita SetUp?

Respuesta

9

Tienes que llamar al método directamente.

[SetUp] 
    public void DerivedSetUp() 
    { 
     base.BaseSetUp(); 
     // Do something else 
    } 

Editar: No he probado, pero tal vez un método parcial podría funcionar también. Sin embargo, preferiría hacer lo anterior.

Edit2: Acabo de probar el uso de métodos parciales. No funcionó. Incluso si lo hiciera, creo que todavía será más fácil llamar a la clase base.

+0

Lo sé. Yo no quiero –

+0

Método parcial, entonces? Debido a que el SetUp está decorado con un atributo, no estoy seguro de que haya demasiadas formas de hacerlo. –

+0

Ooh. No pensé en métodos parciales. Enfoque interesante. –

3

Tiene la clase base explícitamente. Dado que NUnit usa el atributo [Configuración] para marcar la configuración de la prueba, creo que esto es "lo correcto" que hacer para NUnit, porque sigue las reglas de lenguaje habituales.

Claro, NUnit podría buscar las clases base, y llamar a sus funciones de configuración automágicamente, pero creo que esto sería bastante sorprendente para la mayoría de las personas.

Sin embargo, existe al menos un marco de prueba de unidades que utiliza constructores para la configuración: xUnit.Net. Aquí, la configuración de la clase base es llamada automáticamente, porque así es como se comportan los constructores en C#.

(Tenga en cuenta, sin embargo, que xUnit.Net recomienda de nuevo utilizando la configuración de prueba.)

-1

las siguientes obras en MbUnit. También puede funcionar en NUnit.

[TestFixture] 
public abstract class Base { 
    [SetUp] 
    public virtual void SetUp() { 
     //Some stuff. 
    } 
} 

public class Derived : Base { 
    public override void SetUp() { 
     base.SetUp(); 
     //Some more stuff. 
    } 
    [Test] 
    public virtual void Object_WhenInACertainState_WhenAMethodIsCalled_Throws() { 
     //Create and set state on the object. 
     //Call the method. 
     //Assert the method threw. 
    } 
} 
0

Un enfoque que utilizo que he aprendido en el TDD FireStarter en Tampa era tener el método de configuración de la clase base y luego tener un método virtual en la clase base llamada observar. Este método se llama en la clase base al final del método de configuración.

Luego, lo que haces es en la nueva clase que deriva de la clase base que anularás el método de observación. El truco en este escenario es que desea ejecutar el método de instalación de la clase base y la clase secundaria no tiene un método de instalación. La razón para esto es que el código que tienes en el método de observación son solo las cosas adicionales que necesitas para la clase de prueba infantil.

Este enfoque funciona bien para mí, pero tengo la impresión de que el examinador querrá ejecutar las pruebas de la clase base, entonces lo que yo hago para evitarlo es mover las Pruebas de la clase base a una nueva clase que deriva de la base si tengo alguno.

+0

Ese es el patrón de "método de plantilla" que menciono en mi pregunta. Aunque es bueno saber que algunos campamentos lo recomiendan. –

1

Parece que desea que la configuración se ejecute una vez antes de que se inicie cualquier prueba, ni una vez antes de ejecutar cada prueba. La anotación [SetUp] hace que el método se ejecute una vez antes de ejecutar cada prueba en su dispositivo. [SetUp] no es heredado.

La anotación que desea utilizar es [TestFixtureSetUp] que se ejecuta solo una vez, antes de ejecutar cualquiera de las pruebas en un dispositivo. Esto se hereda de la manera que cabría esperar. :)

Ver the TextFixtureSetUp docs

+1

No. Quiero que esta configuración se ejecute antes de cada prueba. –

Cuestiones relacionadas