2014-09-17 13 views
7

Próbuję utworzyć test jednostki do uruchomienia z kontrolerami, które są zawarte w projekcie szablonu .NET dla MVC 5 w Visual Studio 2013 przy użyciu Framework 4.5.1.Utwórz test jednostki dla kontrolera MVC 5 z Owinem

To miało na celu przetestowanie klasy ManageController zawartej w projekcie dla standardowego logowania użytkownika.

Oto kod używam wywołać akcję index kontrolera (należy pamiętać, że „Index” działanie jest domyślny):

[TestClass] 
public class ManageControllerTests { 
    [TestMethod] 
    public async Task ManageController_Index_ShoudlPass() { 
     using (var server = TestServer.Create<Startup>()) { 
      var response = await server.HttpClient.GetAsync("/Manage"); 
      Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
     } 
    } 
} 

Test nie powiedzie, ale odpowiedź jest 404. A jeśli próbuję debugować, proces nie wydaje się uderzać w metodę Index w kontrolerze lub zdarzenie konstruktora kontrolera.

Dodałem pakiet "Microsoft.Owin.Testing" przez NuGet. Metoda konfiguracji w klasie uruchamiania aplikacji jest wywoływana poprawnie.

Czego mi brakuje? Nie mogłem znaleźć wyraźnego przykładu w Internecie, aby wdrożyć ten test. Czy ktoś może umieścić tutaj krok po kroku, jak przetestować ten kontroler?

Dzięki

Odpowiedz

1

Nie możesz tego zrobić. Rurociąg OWIN ma działać w sposób odłączony od jakiegokolwiek środowiska hostingowego.

MVC jest silnie związana z system.web, co utrudnia testowanie za pomocą potoku OWIN.

można zrobić coś podobnego tak:

[TestClass] 
public class ManageControllerTests { 
    [TestMethod] 
    public async Task ManageController_Index_ShoudlPass() { 
     using (var server = CustomTestServer.Create<Startup>()) { 
      server.OnNextMiddleware = context => 
      { 
       context.Response.StatusCode.ShouldBe(Convert.ToInt16(HttpStatusCode.OK)); 
       return Task.FromResult(0); 
      } 
      var response = await server.HttpClient.GetAsync("/Manage"); 
     } 
    } 

Trzeba będzie czerpać

public class CustomTestServer : TestServer 

i dodać middleware w konstruktorze po istniejącej warstwy pośredniej

appBuilder.Use(async (context, next) => 
    { 
     await OnNextMiddleware(context); 
    }); 

I członek publiczny

public Func<IOwinContext, Task> OnNextMiddleware { get; set; }

Stamtąd, gdy dzwonisz server.httpclient.getasync... middleware minie odpowiedzi na następnym pośredniczącego w obsłudze.

+0

Nie podążam za tym przykładem, gdzie "appBuilder" (async..' idź? Który konstruktor? –

+0

Hi @MattKocaj, w konfiguracji testowej utwórz instancję serwera testowego '' 'Instance = TestServer. Utwórz (); '' 'i StartupBdd, będziesz potrzebować' '' public void Configuration (IAppBuilder app) '' ', której można użyć do skonfigurowania aplikacji. [Msdn doc] (https://msdn.microsoft .com/en-us/library/microsoft.owin.testing.testserver.create (v = vs.113) .aspx) –

Powiązane problemy