2012-05-25 28 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")); 

但是,它返回錯誤。

失敗:MvcContrib.TestHelper.AssertionException:價值 參數 'sortby' 不匹配:預期 '' 但 '';沒有值 在名爲'sortby'的路由上下文動作參數中找到 - 您的 匹配路由是否包含名爲'sortby'的令牌?

我錯過了什麼?

+1

我認爲第一個測試失敗::'「〜/ whatever/list」.ShouldMapTo (c => c.Index(string.Empty,string.Empty));'嘗試用'null'而不是' string.Empty'因爲'null'是'string'的默認值。 – nemesv

+0

如果你是這樣做的答案,我會標記它的答案。這似乎是這樣做的,我不知道爲什麼這沒有打我。 –

回答

3

基於斷言消息(expected '' but was '';這樣的一個值是null或assertation string.Empty)你的第一個測試失敗,因爲你用string.Empty但對於字符串的默認值是null

更改您的斷言來使用null它應該wotk:

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

如果Index的參數是int,會怎麼樣?那麼你不能傳遞null,你會如何通過測試(不改變控制器的方法,除非爲空)? – BornToCode

+0

然後我猜你需要使用'0',因爲這是int的默認值。所以你的斷言看起來像「〜/ whatever/list」.ShouldMapTo (c => c.Index(0,0));'但是我不能確定沒有看到你的控制器和你的路由配置 – nemesv

+0

實際上這個是我的嘗試,但控制器的行動接受int和斷言失敗,因爲它得到空,而不是(不能作爲非空可以int) - '預期'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"));