2009-07-03 15 views
13

Mam trudności z napisaniem niektórych testów jednostkowych, aby przetestować niestandardowy moduł modelowania, który utworzyłem. ModelBinder Próbuję test jednostki jest JsonDictionaryModelBinder, który opublikowałem here.Jak przeprowadzać testowanie niestandardowego elementu modelowania za pomocą narzędzia Moq?

Problem, który mam, polega na tym, że wszystkie ustawienia są wyśmiewane za pomocą Moq. Wciąż otrzymuję Null Exceptions ze względu na to, że HttpContextBase nie jest prawidłowo wyśmiewany. Myślę.

Czy ktoś może mi pomóc dowiedzieć się, co nie robię poprawnie?

Oto próbka badanej jednostki staram się napisać, że nie działa:

[TestMethod()] 
public void BindModelTest() 
{ 
    JsonDictionaryModelBinder target = new JsonDictionaryModelBinder(); 

    NameValueCollection nameValueCollection = new NameValueCollection() { 
     {"First", "1"}, 
     {"Second", "2"}, 
     {"Name", "Chris"}, 
     {"jsonValues", "{id: 200, name: 'Chris'}"} 
    }; 

    HttpContextBase httpContext = MockHelper.FakeHttpContext(HttpVerbs.Post, nameValueCollection); 

    ControllerContext controllerContext = 
     new ControllerContext(new RequestContext(httpContext, new RouteData()), new Mock<Controller>().Object); 


    Predicate<string> predicate = propertyName => (propertyName == "jsonValues"); 
    ModelBindingContext bindingContext = new ModelBindingContext() 
    { 
     Model = null, 
     ModelType = typeof(JsonDictionary), 
     ModelState = new ModelStateDictionary(), 
     PropertyFilter = predicate, 
     ValueProvider = new Dictionary<string, ValueProviderResult>() { { "foo", null } } 
    }; 

    //object expected = null; // TODO: Initialize to an appropriate value 
    var actual = target.BindModel(controllerContext, bindingContext) as JsonDictionary; 

    Assert.IsNotNull(actual); 

    Assert.AreEqual("Chris", actual["name"]); 
    //Assert.AreEqual(expected, actual); 
    Assert.Inconclusive("Verify the correctness of this test method."); 
} 

Oto metoda „FakeHttpContext” użyte powyżej:

public static class MockHelper 
{ 
    public static HttpContextBase FakeHttpContext(HttpVerbs verbs, NameValueCollection nameValueCollection) 
    { 
     var httpContext = new Mock<HttpContextBase>(); 

     var request = new Mock<HttpRequestBase>(); 
     request.Setup(c => c.Form).Returns(nameValueCollection); 
     request.Setup(c => c.QueryString).Returns(nameValueCollection); 

     var response = new Mock<HttpResponseBase>(); 
     var session = new Mock<HttpSessionStateBase>(); 
     var server = new Mock<HttpServerUtilityBase>(); 
     httpContext.Setup(c => c.Request).Returns(request.Object); 

     var u = verbs.ToString().ToUpper(); 
     httpContext.Setup(c => c.Request.RequestType).Returns(
      verbs.ToString().ToUpper() 
     ); 

     httpContext.Setup(c => c.Response).Returns(response.Object); 
     httpContext.Setup(c => c.Server).Returns(server.Object); 
     httpContext.Setup(c => c.User.Identity.Name).Returns("testclient"); 
     return httpContext.Object; 
    } 
} 

Odpowiedz

7

winowajcą jest to linia:

To jest technicznie drugi Setup na obiekcie Request, d usuwa oryginalny plik Setup, mimo że przechodzisz do "przeszłości" w hierarchii obiektów. Nie jestem pewien, czy jest to błąd w Moqu, czy pożądane zachowanie, już wcześniej tego doświadczyłem i nie zdążyłem go sprawdzić.

Możesz go rozwiązać, przenosząc tę ​​linię do miejsca, w którym konfigurujesz swoje żądanie powyżej i ustawiając je bezpośrednio, zamiast przechodzić przez httpContext. Więc

request.Setup(c => c.RequestType).Returns(verbs.ToString().ToUpper()); 

Ja również zauważyć, że "var u" Oświadczam, że nie jest używana;)

+0

Niesamowite dzięki! –

Powiązane problemy