2009-07-30 13 views
6

Próbuję ramy MOQ i teraz mam uderzyć w barierę. Poniższy test jednostki kończy się niepowodzeniem, ponieważ rzeczywista wartość właściwości ViewName jest pustym ciągiem.Jak drwić z kontekstu kontrolera z moq

Czy ktoś może wskazać mi właściwy kierunek, dlaczego nie przechodzi testu?

[TestMethod] 
public void Can_Navigate_To_About_Page() 
{ 
    var request = new Mock<HttpRequestBase>(); 
    request.Setup(r => r.HttpMethod).Returns("GET"); 
    var mockHttpContext = new Mock<HttpContextBase>(); 
    mockHttpContext.Setup(c => c.Request).Returns(request.Object); 

    var controllerContext = new ControllerContext(mockHttpContext.Object, 
           new RouteData(), 
           new Mock<ControllerBase>().Object); 
    var controller = new HomeController(); 

    controller.ControllerContext = controllerContext; 
    var result = controller.About() as ViewResult; 

    Assert.AreEqual("About", result.ViewName); 
} 

Poniższy tekst daje także pustą nazwę widoku.

 HomeController controller = new HomeController(); 
     ViewResult result = controller.About() as ViewResult; 
     Assert.IsNotNull(result); 
     Assert.AreEqual("About", result.ViewName); 

Z przykładów w internecie, które wykazują szyderczym i również dobrej TTD jestem po prostu mylić, co drugi węzeł sanitarny muszę zrobić albo z powyższym pierwszym przykładem pracy badanego urządzenia.

Cheers,

Andrew

Odpowiedz

7

powodem jest próba się niepowodzeniem, ponieważ to, co decyduje o VIEWNAME gdy nie jest jednoznacznie określić jeden w głąb struktury. Mówiąc dokładniej, w widoku silnika. Aby przetestować to tak, jak to jest, musiałbyś wyłudzić znacznie więcej z potoku żądania.

Co zrobić, i polecam, jest nie polegać na domyślne i określić pogląd explicite:

return View("About"); 

wtedy wartość będzie tam testować bez szyderczy niczego:

var controller = new HomeController(); 
var result = controller.About() as ViewResult; 
Assert.AreEqual("About", result.ViewName); 
+0

Dziękuję, po zobaczeniu jednego z sygnatur metody jest View (ciąg viewName, model obiektu) Twój punkt ma sens! P.s. test przeszedł! :-) –

3

Dzieje się tak dlatego, ponieważ przyjmujecie założenia dotyczące działania struktury MVC. Jeśli opierasz się na konwencjach, aby zlokalizować widok, struktura faktycznie pozostawia właściwość ViewName jako String.Empty do ExecuteResult() jest wywoływana.

Możesz zobaczyć ten kod na linii 68 ViewResultBase.ExecuteResult ciągu the MVC source:

if (String.IsNullOrEmpty(ViewName)) { 
    ViewName = context.RouteData.GetRequiredString("action"); 
} 

Ponadto należy uważać na to, co testujemy. Zasadniczo powinieneś skupić się na testowaniu kodu, który napiszesz,, a nie na kodzie frameworka. Testowanie, aby upewnić się, że nazwa widoku według konwencji jest poprawnie rozwiązana, jest naprawdę testem jednostkowym dla samej struktury, a nie aplikacji na niej zbudowanej.

Jeśli szukasz dobrego sposobu na wyśmiewanie się w MVC, możesz przyjrzeć się testowaniu tras (które wyglądają tak, jakbyś chciał to zrobić tutaj). Możesz zacząć find a post by Phil Haack concerning just this subject, aby zacząć.