ASP.NET MVC - макет запроса формы - PullRequest
3 голосов
/ 16 марта 2009

Я только изучаю 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();
        }

        }

    }

Ответы [ 3 ]

2 голосов
/ 22 апреля 2011

Вы также можете издеваться над формой, и я предлагаю вам взглянуть на http://mvccontrib.codeplex.com/:

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

2 голосов
/ 16 марта 2009

Если вы измените метод действия на 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();
        }

        }

    }
1 голос
/ 16 марта 2009

Если вы не тестируете сам MVC, разве вы не должны в основном проверять, что действие контроллера правильно работает с аргументами, передаваемыми платформой?

Вероятно, вы можете смоделировать более косвенный доступ к форме через:

controller.ActionInvoker.InvokeAction(ctx);

где ctx - это ControllerContext, с данными формы и т. Д. Вот пример использования rhino для предоставления контекста (также показан MoQ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...