我在ASP.NET MVC應用程序中編寫了一些自定義模型綁定器(實現IModelBinder)。我想知道什麼是單元測試的好方法(粘合劑)?如何在ASP.NET MVC中測試自定義模型綁定器?
20
A
回答
12
我就是這麼做的:
var formElements = new NameValueCollection() { {"FirstName","Bubba"}, {"MiddleName", ""}, {"LastName", "Gump"} };
var fakeController = GetControllerContext(formElements);
var valueProvider = new Mock<IValueProvider>();
var bindingContext = new ModelBindingContext(fakeController, valueProvider.Object, typeof(Guid), null, null, null, null);
private static ControllerContext GetControllerContext(NameValueCollection form) {
Mock<HttpRequestBase> mockRequest = new Mock<HttpRequestBase>();
mockRequest.Expect(r => r.Form).Returns(form);
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);
}
然後,我只是在BindingContext中的變量,以實現該IModelBinder接口的對象的BindModel方法傳遞。
12
這裏有一個簡單的沒有嘲笑的方式我爲你寫上我的博客假設你使用ValueProvider而不是HttpContext的:http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx
[TestMethod]
public void DateTime_Can_Be_Pulled_Via_Provided_Month_Day_Year_Hour_Minute_Second_Alternate_Names()
{
var dict = new ValueProviderDictionary(null) {
{ "foo.month1", new ValueProviderResult("2","2",null) },
{ "foo.day1", new ValueProviderResult("12", "12", null) },
{ "foo.year1", new ValueProviderResult("1964", "1964", null) },
{ "foo.hour1", new ValueProviderResult("13","13",null) },
{ "foo.minute1", new ValueProviderResult("44", "44", null) },
{ "foo.second1", new ValueProviderResult("01", "01", null) }
};
var bindingContext = new ModelBindingContext() { ModelName = "foo", ValueProvider = dict };
DateAndTimeModelBinder b = new DateAndTimeModelBinder() { Month = "month1", Day = "day1", Year = "year1", Hour = "hour1", Minute = "minute1", Second = "second1" };
DateTime result = (DateTime)b.BindModel(null, bindingContext);
Assert.AreEqual(DateTime.Parse("1964-02-12 13:44:01"), result);
}
3
字典可重構這樣
FormCollection form = new FormCollection
{
{ "month1", "2" },
{ "day1", "12" },
{ "year1", "1964" },
{ "hour1", "13" },
{ "minute1", "44" },
{ "second1", "01" }
};
var bindingContext = new ModelBindingContext() { ModelName = "foo", ValueProvider = form.ToValueProvider() };
相關問題
- 1. asp.net mvc自定義模型綁定器
- 2. Asp.net MVC 3 - 自定義模型綁定
- 3. asp.net mvc自定義模型綁定
- 4. asp.net mvc和linq to entities:如何測試模型的自定義綁定?
- 5. 單元測試自定義模型綁定控制器
- 6. 自定義模型綁定MVC
- 7. 爲模型元組創建MVC自定義模型綁定器
- 8. 使用ASP.NET MVC模型綁定器進行單元測試
- 9. 將自定義模型綁定器綁定到自定義AuthorizeAttribute
- 10. asp.net Core 2自定義模型綁定器與複雜模型
- 11. Asp.net MVC類型雙模型綁定器
- 12. ASP.Net MVC自定義模型綁定說明
- 13. ASP.NET MVC - 自定義模型綁定的ID字段
- 14. 自定義模型綁定
- 15. 複雜類型MVC的自定義模型綁定器3
- 16. 如何獲取模型綁定以使用ASP.NET MVC中的自定義對象?
- 17. 如何將asp.net mvc 3自定義模型綁定器GetPropertyValue屬性綁定器參數
- 18. asp.net mvc模型綁定
- 19. ASP.Net MVC模型綁定
- 20. 模型綁定ASP.NET MVC
- 21. ASP.NET MVC模型綁定
- 22. ASP.NET MVC模型綁定
- 23. 我如何在ASP.Net中測試自定義ActionFilter MVC
- 24. 自定義模型綁定器
- 25. 使用ASP.NET MVC中的自定義模型綁定器驗證整數字段
- 26. T4MVC自定義模型綁定器
- 27. 單元測試(xUnit)具有自定義輸入模型的ASP.NET Mvc控制器?
- 28. 使用MVC自定義模型綁定器?
- 29. ASP.NET MVC - 測試頁面到模型綁定
- 30. 單元測試ASP.net MVC JSON模型綁定?
的構造器用於ModelBindingContext的重載似乎不存在。 – 2013-08-01 10:16:23
是的,我只是使用無參數的構造函數,然後用模擬的ControllerContext直接調用BindModel。似乎工作到目前爲止。 – 2014-04-15 13:15:16