Existe uma maneira de ter um SetUpFixture que é executado uma vez por classe em vez de uma vez por namespace?

Cenário
Primeiro de tudo, eu sou novo nos testes - então, por favor, tenha paciência comigo. Dentro do meuprojeto de teste, existe uma pasta Controladores. A pasta Controladores pode conter um ControllerATest.cs, ControllerBTest.cs e ControllerCTest.cs. Como meu namespace se alinha à minha estrutura de pastas, todos eles compartilham o namespace MyProject.Tests.Controllers.

Pelo que eu li noDocumentação do NUnit SetUpFixture, um [SetUpFixture] dentro desse espaço para nome será executado uma vezpara todo o espaço para nome. Ou seja, se eu executar todos os meus testes de controlador de uma só vez - o SetUpFixture será executado apenas uma vez.

Problema
Como eu disse, cada teste de controlador compartilha um espaço para nome. SetUpFixtures se aplicam a todo o espaço para nome. E se eu quiser que cada controlador tenha suapróprio SetUpFixture? Este é um problema quando SetUpFixtures se aplica a espaços para nome inteiros. O que eu quero é algo que seja executado uma vez, e não por teste. Uma das coisas que faço dentro do SetUp do meu SetUpFixture é instanciar um controlador. Claro, eu poderia instanciar todos os 3 controladores no SetUpFixture, mas isso parece feio quando talvez eu esteja apenas testando o ControllerC. Isso realmente não parece limpo. Portanto, eu gostaria de um SetUpFixture que se apliquesó para a classe em que aparece, como ControllerCTests.

Pelo que li, essa funcionalidade específica parece impossível com o NUnit. E se não for possível com o NUnit, isso me faz pensar que não é um cenário comum. E se não for um cenário comum, estou fazendo algo errado. Minha pergunta é, o que? Talvez minha estrutura de teste esteja desativada e precise mudar. Ou talvezé possível com o NUnit?

Código
Um exemplo da minha estrutura desejada:

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()
        {
            //
        }
    }
}
}    

Coisas que eu tentei

Movendo cada arquivo .cs para sua própria pasta, para que eles tenham espaços para nome diferentes. Tecnicamente, isso resolve o problema, apenas parece um pouco feio ter um monte de subpastas com apenas 1 item em cada uma delas. Feio e não corresponderá mais à estrutura do meu projeto pai, pela qual eu estava indo. Mas - talvez este seja o caminho a seguir.Não instanciando meu controlador noSetUpFixture SetUp e, em vez disso, faça-oTestFixture Configure para que um novo seja instanciado para cada teste (por exemplo: 5 testes = 5 instâncias separadas) em vez de uma vez por classe ou espaço de nome. Embora pareça que eu consiga criar apenas uma instância, eu deveria.

Sugestões?

questionAnswers(2)

yourAnswerToTheQuestion