2012-12-13 14 views
7

Próbując wysuszyć moje testy jednostkowe, próbuję użyć AutoFixture jako kontenera IoC do utworzenia instancji testowanego systemu (SUT), który w tym konkretnym przypadku to ASP.NET MVC Controller s. Dlatego chcę dostosować AutoFixture do tworzenia kontrolerów bez właściwości automatycznych.Jak zastosować dostosowania AutoFixture do wszystkich dziedziczących z klasy bazowej?

Próbowałem dodać dostosowanie do ControllerBase, ale nie wydaje się działać dla podklas ControllerBase.

fixture.Customize<ControllerBase>(c => c.OmitAutoProperties()); 

Oto przykład testu Chcę, aby móc napisać:

[Theory, AutoFixtureData] 
    public void ControllerTest(AccountController controller) { 
     Assert.Equal(default(UrlHelper), controller.Url); 
    } 

Oczywiście, to działa, jeśli ręcznie dodać jeden dostosowanie do każdego konkretnego kontrolera w moim projekcie, ale kto chce Zrób to? Czy istnieje lepszy sposób?

+1

używam http://stackoverflow.com/a/11657881/11635 –

Odpowiedz

7

Poniższy Dostosowanie przechodzi powyższy test, i robi to, co wydaje się zapytać

public class MvcCostumization : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Customizations.Add(
      new FilteringSpecimenBuilder(
       new MethodInvoker(new ModestConstructorQuery()), 
       new ControllerSpecification())); 
    } 

    private class ControllerSpecification : IRequestSpecification 
    { 
     public bool IsSatisfiedBy(object request) 
     { 
      var t = request as Type; 
      if (t == null) 
       return false; 

      return typeof(ControllerBase).IsAssignableFrom(t); 
     } 
    } 
} 

jednak, że wyłącza wszystkie właściwości wszystkich kontrolerów MVC, w tym User, HttpContext, ModelState, Request, Response, itp. Możesz potrzebować tych w testach jednostkowych, więc czy na pewno chcesz to zrobić?

Będę pierwszą osobą, która zgodzi się, że podstawowa klasa MVC Controller jest jednym wielkim naruszeniem SRP, ale jest to klasa, która jest nam dana, więc nie możemy nic zrobić poza próbą jak najlepszego wykorzystania .

Zazwyczaj wystarczy trochę go przekręcić, aby automatycznie uzupełnić większość właściwości AutoFixture.

w MVC 3 projekty, to w połączeniu z AutoMoq extension, jest wystarczająca do utworzenia instancji kontrolera:

fixture.Customize<ModelBindingContext>(c => c 
    .Without(x => x.Model) 
    .Without(x => x.ModelType)); 
fixture.Inject(CultureInfo.CurrentCulture); 
+2

Dzięki za radę. Używam MVC4, a także musiałem dodać 'fixture.Customize (c => c.Without (x => x.DisplayMode));' –

Powiązane problemy