English 中文(简体)
ASP.NET MVC - 模拟表单请求
原标题:
  • 时间:2009-03-16 10:56:32
  •  标签:

我正在学习ASP.NET MVC,并尝试为单元测试创建模拟表单请求。

我正在使用RhinoMocks。

我已查看以下网站,但无法使其正常工作。

将此翻译为中文:http://blog.maartenballiauw.be/post/2008/03/19/ASPNET-MVC-Testing-issues-Q-and-A.aspx

Update: Controller Code:

    /// <summary>
    /// Creates a new entry
    /// </summary>
    /// <returns></returns>
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create([Bind()]Person person) 
    {
        if (Request.Form["DateOfBirth"].ToString() == "")
        {
            TempData["message"] = "Please select a date of Birth";
            ViewData["DateOfBirth"] = Request.Form["DateOfBirth"].ToString();

            MvcValidationAdapter.TransferValidationMessagesTo(ViewData.ModelState, person.ValidationMessages);
            return View();
        }
        else
        { 

        if (person.IsValid())
        {
            person.DateOfBirth = Convert.ToDateTime(Request.Form["DateOfBirth"]);

            personRepository.SaveOrUpdate(person);
            TempData["message"] = person.Firstname + " was successfully added";
            return RedirectToAction("Create", "OrderDetails", new { id = person.ID });
        }
        else
        {

            ViewData["DateOfBirth"] = Request.Form["DateOfBirth"].ToString();

            MvcValidationAdapter.TransferValidationMessagesTo(ViewData.ModelState, person.ValidationMessages);
            return View();
        }

        }

    }
最佳回答

如果你将动作方法改为将FormCollection作为最后一个参数,那么你可以传入一个包含所有值的FormCollection实例。当运行时,MVC框架会自动将来自表单的值传递到该参数中。

public ActionResult MyMethod(FormCollection form)
{
    // in testing you will pass in a populated FormCollection object
    // at runtime the framework will populate the form parameter with
    // the contents of the posted form
}

这里是它被使用的一个合理示例。(链接)

编辑

你试过这个吗?

    /// <summary>
    /// Creates a new entry
    /// </summary>
    /// <returns></returns>
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create([Bind()]Person person, FormCollection form) 
    {
        if (form["DateOfBirth"].ToString() == "")
        {
            TempData["message"] = "Please select a date of Birth";
            ViewData["DateOfBirth"] = form["DateOfBirth"].ToString();

            MvcValidationAdapter.TransferValidationMessagesTo(
                ViewData.ModelState, person.ValidationMessages);
            return View();
        }
        else
        { 

        if (person.IsValid())
        {
            person.DateOfBirth = Convert.ToDateTime(form["DateOfBirth"]);

            personRepository.SaveOrUpdate(person);
            TempData["message"] = 
                person.Firstname + " was successfully added";
            return RedirectToAction(
                "Create", "OrderDetails", new { id = person.ID });
        }
        else
        {

            ViewData["DateOfBirth"] = form["DateOfBirth"].ToString();

            MvcValidationAdapter.TransferValidationMessagesTo(
                ViewData.ModelState, person.ValidationMessages);
            return View();
        }

        }

    }
问题回答

你也可以嘲笑这个表格,我建议你看一下 http://mvccontrib.codeplex.com/:

var form = new NameValueCollection(); form.Add("publish", "true"); _controller.Request.Stub(x => x.Form).IgnoreArguments().Return(form);

除非您正在测试MVC本身,否则您应该主要测试控制器的操作是否正确处理框架传递的参数。

您可能可以更加间接地访问形式进行嘲笑:

controller.ActionInvoker.InvokeAction(ctx);

这里的ctx是一个ControllerContext,包括表单数据等等。这里提供了使用rhino提供上下文的示例(MoQ也被显示)。这里是链接





相关问题
热门标签