2012-05-25 11 views
5

ich diese Controller-Methode habe:Wie eine MVC-Route mit optionaler Abfragezeichenfolgeflag Prüfparameter

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

Ich versuche es Tests mit MvcContrib Route zu testen:

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

, gibt es diese Error.

Fehler: MvcContrib.TestHelper.AssertionException: Wert für Parameter 'sortby' stimmen nicht überein: erwartet '', sondern war ''; Kein Wert gefunden in der Route Kontext Aktionsparameter namens 'sortby' - enthält Ihre passende Route ein Token namens 'sortby'?

Was fehlt mir?

+1

Ich denke, die ersten Tests versagt :: ' "~/was auch immer/list" .ShouldMapTo (c => c.Index (string.Empty, string.Empty));' versuchen mit 'null' statt' string.Empty', weil 'null' der Standardwert von' string' ist. – nemesv

+0

Wenn Sie, dass als Antwort zu tun wäre, würde ich es beantwortet markieren. Das schien es zu tun, ich weiß nicht, warum das mich nicht getroffen hat. –

Antwort

3

Auf der Basis der Assertion-Nachricht (expected '' but was ''; so einer der Werte ist null oder string.Empty in der Geltendmachung) Ihr erster Test versagt, weil Sie string.Empty für String aber der Standardwert verwendet wird null

Ihre assert ändern zu verwenden null und es sollte wotk:

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

Was wäre, wenn Index-Parameter ints wären? Dann können Sie nicht null übergeben, wie würden Sie diesen Test bestehen lassen (ohne die Methode des Controllers zu ändern, um NULL-Werte zu erhalten)? – BornToCode

+0

Dann denke ich, würden Sie brauchen, 'zu verwenden 0 'denn das ist der Standardwert int ist. So würde Ihre Assert aussehen wie "~/was auch immer/list" .ShouldMapTo (c => c.Index (0, 0)); aber ich kann nicht sicher sein, ohne Ihren Controller und Ihre Routing-Konfigurationen zu sehen – nemesv

+0

Eigentlich dies ist was ich versuchte, aber die Aktion des Controllers akzeptiert int und die Assertion schlägt fehl, weil sie stattdessen null (was ich nicht als non nullable int übergeben kann) - 'expected '0' aber war ''' – BornToCode

2

Früher habe ich wie

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"));