Тестирование пользовательского ModelBinder против контекста HTTP в ASP.NET MVC (1.0) - PullRequest
0 голосов
/ 03 октября 2010

Я пытаюсь выполнить модульное тестирование пользовательского связывателя модели - в частности, я хочу увидеть, как он реагирует на различные (возможно, конфликтующие) значения, представленные в коллекциях Request.Form и Request.QueryString - т.е. если я отправляю одно значениев форме и другой в строке запроса (да, да, я знаю, это зло, но я хочу тестовое покрытие в случае, если это произойдет), я могу точно определить, какой из них будет привязан к модели.

ВЧтобы сделать это, я хотел бы смоделировать / подделать контекст HTTP, а затем вызвать механизм связывания модели и посмотреть, что на самом деле возвращается.Я видел несколько постов о тестировании ModelBinder, но все они используют собственный ValueProvider, тогда как я на самом деле хочу проверить, как MVC взаимодействует с коллекциями Form / Request.

Есть какие-нибудь идеи, как я могу смоделировать эти коллекции и затем заставить связыватель моей модели использовать ValueProvider по умолчанию на основе этого поддельного HTTP-контекста в моих юнит-тестах?Это на ASP.NET MVC 1.0.Спасибо.

1 Ответ

0 голосов
/ 03 октября 2010

Пригвоздил это - решение состоит в том, чтобы смоделировать ControllerContext, а затем создать новый System.Web.Mvc.ValueProviderDictionary и передать ваш контекста контекста контроллера в конструктор следующим образом:

[Test]
public void WorkFolder_Id_Is_Parsed_From_QueryString() {

    var fakeControllerContext = GetControllerContext(null, "folder=10");

    var bindingContext = new ModelBindingContext() {
        ValueProvider = new System.Web.Mvc.ValueProviderDictionary(fakeControllerContext),
        ModelName = "menu",
        FallbackToEmptyPrefix = true

    };
    var binder = new RenewalMenuPostModelBinder();
    var model = binder.BindModel(fakeControllerContext, bindingContext) as RenewalMenuPostModel;
    Assert.That(model is RenewalMenuPostModel);
    Assert.That(model.WorkFolderId.HasValue);
    Assert.That(model.WorkFolderId.Value == 10);

}



private static ControllerContext GetControllerContext(NameValueCollection form, string queryString) {
    Mock<HttpRequestBase> mockRequest = new Mock<HttpRequestBase>();
    mockRequest.Expect(r => r.Form).Returns(form);

    var queryStringCollection = HttpUtility.ParseQueryString(queryString);
    mockRequest.Expect(r => r.QueryString).Returns(queryStringCollection);

    Mock<HttpContextBase> mockHttpContext = new Mock<HttpContextBase>();
    mockHttpContext.Expect(c => c.Request).Returns(mockRequest.Object);

    return new ControllerContext(mockHttpContext.Object, new RouteData(), new Mock<ControllerBase>().Object);
}
...