Unit testing 带FormCollection参数的MVC单元测试控制器方法

Unit testing 带FormCollection参数的MVC单元测试控制器方法,unit-testing,asp.net-mvc-2,asp.net-mvc-controller,Unit Testing,Asp.net Mvc 2,Asp.net Mvc Controller,我有一个接受FormCollection作为参数的控制器方法。 然后,控制器方法使用UpdateModel(model,new[]{P1,P2})构建模型 我想对上述方法进行单元测试。我正在用P1和P2值填充formcollection,但是当从单元测试调用时,模型没有正确构建 有人遇到过类似的问题吗?填充模型时,UpdateModel方法在请求对象中查找,它完全忽略您传递的FormCollection。因此,您需要模拟请求并将值添加到此对象。但这是许多不值得付出努力的工作,我建议您使用更好的方

我有一个接受FormCollection作为参数的控制器方法。 然后,控制器方法使用UpdateModel(model,new[]{P1,P2})构建模型

我想对上述方法进行单元测试。我正在用P1和P2值填充formcollection,但是当从单元测试调用时,模型没有正确构建


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

填充模型时,
UpdateModel
方法在
请求
对象中查找,它完全忽略您传递的
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:-)的更多信息。此外,还允许您选择哪些属性应该包含在绑定中或从绑定中排除,但老实说,如果您使用视图模型,您将永远不会遇到任何问题。