釘它 - 該解決方案是嘲笑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);
}