помощник теста mvccontrib и проверка маршрутов и параметров HTTP post
в моем Asp.net MVC app, у меня есть два метода на контроллере, один для того, когда пользователь сначала прибывает в представление, а затем один, когда они отправляют форму на указанном представлении.
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"));
мой вопрос в тестировании почтовых маршрутов, как я могу написать лямбду, которую я бы использовал для проверки того, что сообщение получает точные значения, подобные тесту GET выше?
для сообщения это выглядит примерно так:
"~/account/foo".
WithMethod(HttpVerbs.Post).
ShouldMapTo<AccountController>(a => something_something);
это something_something часть моей лямбды с этим у меня проблемы. Использование произвольных значений не работает ("a => a.Foo (0, new Account ()"). Как указать ожидаемые значения в рамках теста?
редактировать Я надеялся, что есть что-то похожее на то, как Moq имеет лямбды для таких заявлений, как foo.Установки(с => С. ФОО(Нем.Если(), Это.(Я => Я > 32)) и так далее. Даже я должен явно предоставить значения, это выполнимо-я просто не могу, кажется, grok желаемую структуру, чтобы передать эти явные ценности.
2 ответов
вот пример. Предполагая, что у вас есть следующее действие:
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
аргумент у вас.
используя вспомогательный синтаксис mvccontrib:
"~/account/foo".WithMethod(HttpVerbs.Post).ShouldMapTo<AccountController>(a => a.foo(null));
вы передаете null как Foo (string id, Accounttofoo) метод никогда не выполняется как часть теста маршрутизации.