如何使用可选的查询字符串参数测试 MVC 路由
Posted
技术标签:
【中文标题】如何使用可选的查询字符串参数测试 MVC 路由【英文标题】:How to test an MVC route with optional querystring parameters 【发布时间】:2012-06-01 07:55:58 【问题描述】:我有这个控制器方法:
[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”的标记?
我错过了什么?
【问题讨论】:
我认为第一个测试失败::"~/whatever/list".ShouldMapTo<MyController>(c => c.Index(string.Empty, string.Empty));
尝试使用null
而不是string.Empty
,因为null
是string
的默认值。
如果您将其作为答案,我会将其标记为已回答。这似乎做到了,我不知道为什么没有打到我。
【参考方案1】:
基于断言消息(expected '' but was '';
,因此断言中的值之一是null
或string.Empty
)您的第一个测试失败,因为您使用了string.Empty
,但字符串的默认值为@987654325 @
将您的断言更改为使用null
,它应该可以:
"~/whatever/list".ShouldMapTo<MyController>(c => c.Index(null, null));
【讨论】:
如果Index的参数是整数呢?那么你不能通过null,你如何让那个测试通过(不将控制器的方法更改为nullable)? 那么我猜你需要使用0
,因为这是int的默认值。所以你的断言看起来像"~/whatever/list".ShouldMapTo<MyController>(c => c.Index(0, 0));
但如果没有看到你的控制器和你的路由配置我不能确定
实际上这是我尝试过的,但是控制器的操作接受了 int 并且断言失败,因为它取而代之的是 null(我不能将其作为不可为空的 int 传递)-expected '0' but was ''
【参考方案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"));
【讨论】:
以上是关于如何使用可选的查询字符串参数测试 MVC 路由的主要内容,如果未能解决你的问题,请参考以下文章