如何使用可选的查询字符串参数测试 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&lt;MyController&gt;(c =&gt; c.Index(string.Empty, string.Empty)); 尝试使用null 而不是string.Empty,因为nullstring 的默认值。 如果您将其作为答案,我会将其标记为已回答。这似乎做到了,我不知道为什么没有打到我。 【参考方案1】:

基于断言消息(expected '' but was '';,因此断言中的值之一是nullstring.Empty)您的第一个测试失败,因为您使用了string.Empty,但字符串的默认值为@987654325 @

将您的断言更改为使用null,它应该可以:

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

【讨论】:

如果Index的参数是整数呢?那么你不能通过null,你如何让那个测试通过(不将控制器的方法更改为nullable)? 那么我猜你需要使用0,因为这是int的默认值。所以你的断言看起来像"~/whatever/list".ShouldMapTo&lt;MyController&gt;(c =&gt; 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 路由的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NestjS 中使用可选的 url 参数

如何在 Django 中定义可选的查询参数?

如何使用 React 路由器设置带有可选查询参数的路由?

Spring MVC - 如何检查是不是没有传递意外的查询字符串参数?

在 Symfony2 路由中,如何设置可选的子域

Oracle中如何查询CLOB字段类型的内容