помощник теста 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) метод никогда не выполняется как часть теста маршрутизации.