Ist es ein Weg, um ein SetUpFixture läuft einmal pro Klasse statt einmal pro namespace?

Szenario

Zunächst, ich bin neu zu testen - also bitte Geduld mit mir. In meinem test-Projekt, es ist ein Controller-Ordner. Der Ordner Controller enthält einen ControllerATest.cs, ControllerBTest.cs und ControllerCTest.cs. Da my-namespace an meiner Ordner-Struktur, Sie alle teilen den namespace MyProject.Tests.Controller.

Von dem, was ich gelesen habe, in der NUnit SetUpFixture Dokumentation, a [SetUpFixture] in diesem namespace wird einmal ausgeführt für den gesamten namespace. Das ist, wenn ich alle meine controller tests auf einmal - die SetUpFixture wird nur einmal ausgeführt.

Problem

Wie ich schon sagte, jeder controller test teilt sich einen namespace. SetUpFixtures gelten für den gesamten namespace. Was ist, wenn ich will, daß jeder controller haben Ihre eigenen SetUpFixture? Dies ist ein problem, wenn SetUpFixtures gelten für ganze Namensräume. Was ich will ist etwas, dass einmal ausgeführt, und nicht pro-test. Eines der Dinge, die ich in meinem SetUpFixture SetUp ist instanziieren ein controller. Sicher, ich könnte instanziieren Sie alle 3-Controller in der SetUpFixture, aber das scheint hässlich, wenn vielleicht bin ich nur testen ControllerC. Wirklich scheint nicht sauber. Daher möchte ich eine SetUpFixture das gilt nur der Klasse wird, wie ControllerCTests.

Von dem, was ich gelesen habe, diese spezifische Funktionalität scheint unmöglich zu sein, mit NUnit. Und wenn es nicht möglich ist mit NUnit, das macht mich denke, es ist kein alltägliches Szenario. Und wenn es nicht ein gängiges Szenario, ich mache etwas falsch. Meine Frage ist, was? Vielleicht ist mein Test-Aufbau aus ist und es sich ändern muss. Oder vielleicht ist es ist möglich mit NUnit?

Code

Ein Beispiel für meine gewünschte Struktur:

namespace MyProject.Tests.Controllers
{
public class ControllerATests
{
    private static IMyProjectRepository _fakeRepository;
    private static ControllerA _controllerA;

    [SetUpFixture]
    public class before_tests_run
    {
        [SetUp]
        public void ControllerASetup()
        {
            _fakeRepository = FakeRepository.Create();

            _controllerA = new ControllerA(_fakeRepository);
        }
    }

    [TestFixture]
    public class when_ControllerA_index_get_action_executes
    {
        [Test]
        public void it_does_something()
        {
            //
        }

        [Test]
        public void it_does_something_else()
        {
            //
        }
    }
}

public class ControllerBTests
{
    private static IMyProjectRepository _fakeRepository;
    private static ControllerB _controllerB;

    [SetUpFixture]
    public class before_tests_run
    {
        [SetUp]
        public void ControllerBSetup()
        {
            _fakeRepository = FakeRepository.Create();

            _controllerB = new ControllerB(_fakeRepository);
        }
    }

    [TestFixture]
    public class when_ControllerB_index_get_action_executes
    {
        [Test]
        public void it_does_something()
        {
            //
        }

        [Test]
        public void it_does_something_else()
        {
            //
        }
    }
}
}    

Dinge, die ich Versucht habe

  • Verschieben der einzelnen .cs-Datei in Ihrem eigenen Ordner, so haben Sie unterschiedliche namespaces. Technisch löst dies das problem, es scheint nur ein wenig hässlich, ein paar Unterordner mit nur 1 Punkt in jedem von Ihnen. Hässlich, und wird nicht mehr mit meinen Eltern-Projekt die Struktur, die ich wollte, für. Aber - vielleicht ist dies der Weg zu gehen.
  • Nicht instanziieren meinen controller in die SetUpFixture SetUp, und anstatt es zu tun im TestFixture SetUp, so dass eine neue instanziiert für jeden test (ex: 5 tests = 5 separate Instanzen) statt einmal pro Klasse oder namespace. Obwohl es scheint, dass, wenn ich bekommen kann Weg mit nur 1 Beispiel, ich sollte.

Vorschläge?

InformationsquelleAutor EF0 | 2014-04-18
Schreibe einen Kommentar