0

Я пытаюсь выполнить тестирование тестового связующего объекта - в частности, я хочу видеть, как он реагирует на различные (возможно противоречивые) значения, представленные в запросе .Form и Request.QueryString - то есть, если я отправлю одно значение в форме и другое в querystring (да, да, я знаю, это зло, но я хочу, чтобы тестовое покрытие на случай, если это произойдет). Я могу точно проверить, какой из них будет привязана к модели.Тестирование пользовательского ModelBinder в контексте HTTP в ASP.NET MVC (1.0)

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

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

ответ

0

Nailed это - решение для имитации 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); 
} 
Смежные вопросы