Тестовый помощник mvccontrib и проверка маршрутов и параметров HTTP - PullRequest
6 голосов
/ 29 января 2010

В моем приложении Asp.net MVC у меня есть два метода на контроллере, один для того, когда пользователь впервые появляется в представлении, а затем один, когда они отправляют форму в указанном представлении.

public ActionResult Foo() {}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Foo(string id, Account accountToFoo) {}

Во втором действии есть пользовательский механизм связывания моделей, который собирает объект учетной записи, над которым я работаю, хотя это на самом деле не важно. Все это прекрасно работает при локальном тестировании на сервере.

Мы стараемся хорошо писать модульные тесты, чтобы проверить правильность маршрутизации всех наших представлений, в том числе HTTP POST. Для этого мы использовали тестовый помощник mvccontrib.

Тестирование получилось очень простым

"~/account/foo/myusername".
       Route().
       ShouldMapTo<AccountController>(c => c.Foo("myusername"));

У меня вопрос при тестировании POST-маршрутов. Как мне написать лямбда-код, который я бы использовал, чтобы убедиться, что сообщение получает точные значения, аналогично приведенному выше тесту GET?

Для POST это выглядит примерно так:

"~/account/foo".
         WithMethod(HttpVerbs.Post).
         ShouldMapTo<AccountController>(a => something_something);

Это часть чего-то в моей лямбде, с которой у меня проблемы. Использование произвольных значений не работает («a => a.Foo (0, new Account ()»). Как я могу указать ожидаемые значения как часть теста?

РЕДАКТИРОВАТЬ Я надеялся, что в Moq есть лямбды для таких выражений, как foo.Setup (s => s.Foo (It.IsAny (), It.Is (i =). > i> 32)) и т. д. Даже я должен явно указать значения, это выполнимо - я просто не могу добиться желаемой структуры для передачи этих явных значений.

Ответы [ 2 ]

15 голосов
/ 02 февраля 2010

Вот пример. Предполагая, что у вас есть следующее действие:

public AccountController : Controller
{
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Foo(string id) 
    {
        return View();
    }
}

И зарегистрирован следующий маршрут:

RouteTable.Routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "home", action = "index", id = "" }
);

Вы можете проверить это так:

var routeData = "~/account/foo".WithMethod(HttpVerbs.Post);
routeData.Values["id"] = "123";
routeData.ShouldMapTo<AccountController>(c => c.Foo("123"));

Может потребоваться некоторая настройка, чтобы включить второй Account аргумент, который у вас есть.

2 голосов
/ 10 февраля 2010

Использование вспомогательного синтаксиса mvccontrib:

"~/account/foo".WithMethod(HttpVerbs.Post).ShouldMapTo<AccountController>(a => a.foo(null));

Вы передаете значение null, поскольку метод Foo (идентификатор строки, Account accountToFoo) никогда не выполняется как часть теста маршрутизации.

...