2012-05-25 8 views
5

У меня есть этот метод контроллера:Как протестировать маршрут MVC с опциональным строки запроса параметры

[GET("/whatever/list")] 
public ActionResult Index(string sortby, string order) 

Я пытаюсь проверить его с MvcContrib маршрута тестирования:

"~/whatever/list".ShouldMapTo<MyController>(c => c.Index(string.Empty, string.Empty)); 
"~/whatever/list?sortby=type&order=desc".ShouldMapTo<MyController>(c => c.Index("type", "desc")); 

Однако, он возвращает этот ошибка.

Failure: MvcContrib.TestHelper.AssertionException: Значение для параметра ' SortBy' не совпадают: ожидается, '' но ''; no value , найденный в параметре действия контекста контекста с именем «sortby» - ваш нулевой маршрут содержит токен под названием «sortby»?

Что мне не хватает?

+1

Я думаю, что первые тесты не выполняются :: '' ~/whatever/list ".ShouldMapTo (c => c.Index (string.Empty, string.Empty));' try with 'null' вместо' string.Empty', потому что 'null' является значением по умолчанию' string'. – nemesv

+0

Если бы вы сделали это как ответ, я бы отметил, что он ответил. Казалось, это так, я не знаю, почему это меня не ударило. –

ответ

3

На основании сообщений утверждают, (expected '' but was ''; так один из значений null или string.Empty в assertation) ваш первый тест не удается, потому что вы использовали string.Empty но значение по умолчанию для строки является null

Изменить Assert в использовать null и он должен wotk:

"~/whatever/list".ShouldMapTo<MyController>(c => c.Index(null, null)); 
+0

Что делать, если параметры индекса были ints? Тогда вы не можете передать null, как бы вы сделали этот тестовый проход (без изменения метода контроллера, кроме значения NULL)? – BornToCode

+0

Тогда я думаю, вам нужно использовать '0', потому что это значение по умолчанию для int. Таким образом, ваше утверждение будет выглядеть как '' ~/whatever/list ".ShouldMapTo (c => c.Index (0, 0)) ;, но я не могу быть уверен, не видя ваш контроллер и ваши конфигурации маршрутизации. – nemesv

+0

Фактически это это то, что я пробовал, но действие контроллера приняло int, и утверждение терпит неудачу, потому что вместо него он получает null (который я не могу передать как недействительный int) - 'expected '0', но был ''' – BornToCode

2

Я использовал как

var route = "~/whatever/list".WithMethod(HttpVerbs.Get); 
route.Values.Add("sortby", "type"); 
route.Values.Add("order", "desc"); 
route.ShouldMapTo<MyController>(c => c.Index("type", "desc"));