MVC - 如何模拟/测试POST(request.form)动作?

时间:2011-05-09 13:26:03

标签: asp.net-mvc-3 mocking http-post

在单元测试中有任何一个模拟request.form的示例代码,调用控制器并让控制器使用Bind属性或{{1}成功将模拟request.form绑定到视图模型}?

在我看来这是一个相对常见的要求,但是早上已经过去了,我还没有找到任何既充足又有效的东西。

P.S。我整个上午一直在追逐this因为模型绑定失败而没有运气。

1 个答案:

答案 0 :(得分:1)

这总觉得比它需要的要困难得多。最后,解决方案简单而且相当优雅,但我更愿意看到一些传统的方法来做到这一点。

诀窍是将一个FormCollection参数添加到Action:

这将在运行时由MVC注入,但允许在测试时进行模拟:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Search([Bind(Prefix = "")] ManageUsersViewModel manageUsersViewModel, FormCollection form)
{

在测试中:

var form = new FormCollection
  {
    {"FindCriteria.SearchText", "searchText"},
    {"FindCriteria.AccountIsPending", "true"},
    {"FindCriteria.TermsHaveBeenAccepted", "true"}
  };
  sut.Search(new ManageUsersViewModel(), form);

修改

此外,您还需要另外两件事 - Bind - 不起作用,您需要确保您的控制器具有controllercontext并且您需要明确调用UpdateModel:

controller.ControllerContext = new ControllerContext();

...

UpdateModel(manageUsersViewModel, form.ToValueProvider());  

MVC 3 ,我不得不回复此问题来测试一个简单的表单提交。 在膜中的INSANE