【问题标题】:ASP.NET MVC - Mock a Form RequestASP.NET MVC - 模拟表单请求
【发布时间】:2010-10-13 14:12:07
【问题描述】:

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

我正在使用 RhinoMocks。

我查看了以下网站,但无法使用这些网站。

http://blog.maartenballiauw.be/post/2008/03/19/ASPNET-MVC-Testing-issues-Q-and-A.aspx

更新: 控制器代码:

    /// <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();
        }

        }

    }

【问题讨论】:

    标签: asp.net-mvc unit-testing


    【解决方案1】:

    如果您将操作方法​​更改为将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
    }
    

    Here 是一个合理的例子。

    编辑

    你试过了吗:

        /// <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();
            }
    
            }
    
        }
    

    【讨论】:

    • 谢谢,我仍然无法让它工作。还有其他例子吗?
    • 有机会用一些代码编辑你的问题吗?操作方法和你的测试代码可能吗?
    【解决方案2】:

    你也可以模拟表单,我建议你看看http://mvccontrib.codeplex.com/

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

    【讨论】:

    • 你是如何初始化_controller的?
    【解决方案3】:

    除非您正在测试 MVC 本身,否则您不应该主要测试控制器的操作是否使用框架传递的参数做正确的事情吗?

    您可能可以通过以下方式模拟更多的间接表单访问:

    controller.ActionInvoker.InvokeAction(ctx);
    

    其中 ctx 是 ControllerContext,带有表单数据等。Here's 是使用 rhino 提供上下文的示例(也显示了 MoQ)。

    【讨论】:

      猜你喜欢
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2013-12-21
      相关资源
      最近更新 更多