【问题标题】:MVC Unit Testing Controller Method with FormCollection argument带有 FormCollection 参数的 MVC 单元测试控制器方法
【发布时间】:2010-12-29 00:56:23
【问题描述】:

我有一个控制器方法,它接受 FormCollection 作为参数。 然后控制器方法使用 UpdateModel(Model, new[] { P1, P2 });

构建模型

我想对上述方法进行单元测试。我正在使用 P1 和 P2 值填充表单集合,但从单元测试调用时模型构建不正确。

有没有人遇到过类似的问题?

【问题讨论】:

    标签: unit-testing asp.net-mvc-2 asp.net-mvc-controller


    【解决方案1】:

    UpdateModel 方法在填充模型时查看 Request 对象,它完全忽略了您正在传递的 FormCollection。因此,您需要模拟请求并将值添加到该对象。但这是不值得付出的大量工作,我会向您推荐一种更好的方法:不要使用FormCollection 作为操作参数,然后在您的操作中调用UpdateModel,而是使用强类型操作参数:

    public ActionResult Foo(SomeViewModel model)
    {
        // The model binder will automatically call UpdateModel and populate
        // the model from the request so that you don't need to manually
        // do all this stuff
        ...
    }
    

    在单元测试中,只需在调用控制器操作时传递所需的模型。

    【讨论】:

    • 即使我更喜欢模型方法,但我的经理说如果有人篡改和修改请求怎么办。在构建模型时,我们可以使用 UpdateModel 进行控制。不确定如何说服“经理”
    • @Snehal,您应该使用视图模型。这些是专门针对视图需求量身定制的类。这些类仅包含您需要从视图绑定的属性。所以你有完全的控制权。这是一种比使用FormCollection 更简洁的方法。您的经理应该阅读有关 ASP.NET MVC 的更多信息 :-)。还有BindAttribute 允许您选择哪些属性应该从绑定中包含或排除,但老实说,如果您使用视图模型,您将永远不会遇到任何问题。
    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多