Unit testing 带FormCollection参数的MVC单元测试控制器方法
我有一个接受FormCollection作为参数的控制器方法。 然后,控制器方法使用UpdateModel(model,new[]{P1,P2})构建模型 我想对上述方法进行单元测试。我正在用P1和P2值填充formcollection,但是当从单元测试调用时,模型没有正确构建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。因此,您需要模拟请求并将值添加到此对象。但这是许多不值得付出努力的工作,我建议您使用更好的方
有人遇到过类似的问题吗?填充模型时,
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:-)的更多信息。此外,还允许您选择哪些属性应该包含在绑定中或从绑定中排除,但老实说,如果您使用视图模型,您将永远不会遇到任何问题。