Creación de clases TestFixture anidadas con NUnit

Estoy tratando de dividir una clase de prueba unitaria en agrupaciones lógicas basadas en un escenario específico. Sin embargo, necesito tener un TestFixtureSetUp y TestFixtureTearDown que se ejecutará durante toda la prueba. Básicamente necesito hacer algo como esto:

[TestFixture]
class Tests { 
    private Foo _foo; // some disposable resource

    [TestFixtureSetUp]
    public void Setup() { 
        _foo = new Foo("VALUE");
    }

    [TestFixture]
    public class Given_some_scenario { 
        [Test]
        public void foo_should_do_something_interesting() { 
          _foo.DoSomethingInteresting();
          Assert.IsTrue(_foo.DidSomethingInteresting); 
        }
    }

    [TestFixtureTearDown]
    public void Teardown() { 
        _foo.Close(); // free up
    }
}

En este caso obtengo una NullReferenceException en _foo presumiblemente porque se llama a TearDown antes de que se ejecute la clase interna.

¿Cómo puedo lograr el efecto deseado (alcance de las pruebas)? ¿Hay una extensión o algo para NUnit que pueda usar que ayude? Prefiero quedarme con NUnit en este momento y no usar algo como SpecFlow.

preguntado el 12 de junio de 12 a las 19:06

1 Respuestas

Puede crear una clase base abstracta para sus pruebas, hacer todo el trabajo de configuración y desmontaje allí. Sus escenarios entonces heredan de esa clase base.

[TestFixture]
public abstract class TestBase {
    protected Foo SystemUnderTest;

    [Setup]
    public void Setup() { 
        SystemUnterTest = new Foo("VALUE");
    }

    [TearDown]
    public void Teardown() { 
        SystemUnterTest.Close();
    }
}

public class Given_some_scenario : TestBase { 
    [Test]
    public void foo_should_do_something_interesting() { 
      SystemUnderTest.DoSomethingInteresting();
      Assert.IsTrue(SystemUnterTest.DidSomethingInteresting); 
    }
}

Respondido el 12 de junio de 12 a las 20:06

Pero no hay forma de anidar otra clase debajo de eso. Given_some_scenario ¿clase? La idea era que la clase que abarca sea relativa a toda la sección (por ejemplo, CustomerTests) y luego tener cada subclase para el escenario individual (por ejemplo, When_searching_customers) - Wayne Molina

¿Por qué no agrupar a través de una estructura jerárquica usando herencia? When_searching_customers : CustomerTestBase, When_creating_a_customer : CustomerTestBase, etc? - dennis traub

¡Eso podría funcionar, ahora que lo pienso! ¡Gracias! - Wayne Molina

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.