如何在 ASP.NET MVC 中测试自定义模型绑定器?

发布于 2024-07-08 09:01:35 字数 88 浏览 10 评论 0原文

我在 ASP.NET MVC 应用程序中编写了一些自定义模型绑定程序(实现 IModelBinder)。 我想知道对它们(绑定程序)进行单元测试的好方法是什么?

I've written some custom model binders (implementing IModelBinder) in our ASP.NET MVC application. I'm wondering what is a good approach to unittest them (binders)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夏见 2024-07-15 09:01:35

我是这样做的:

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 方法。

I did it this way:

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);
}

And then I just passed in the bindingContext variable to the BindModel method of the object that implements the IModelBinder interface.

蓬勃野心 2024-07-15 09:01:35

这是我在博客上为您编写的一种简单的非模拟方法,假设您使用 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);  
}  

Here's a simple no-mocks way I wrote for you on my blog assuming you use the ValueProvider and not the 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);  
}  
不乱于心 2024-07-15 09:01:35

dict 可以这样重构

            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() };  

dict could be refactored like this

            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() };  
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文