【问题标题】:Is it possible to look up all name alias of a given type (e.g. "int" versus "Int32")?是否可以查找给定类型的所有名称别名(例如“int”与“Int32”)?
【发布时间】:2016-07-24 01:05:35
【问题描述】:

我一直在编写单元测试来验证 MVC 路由的有效性。例如,

[Route("foo/bar/{id:int}")]
public IHttpActionResult SomeAction(int id)
{
   // ... 
}

应该是有效的,但是

[Route("foo/bar/{id:List<string>}")]
public IHttpActionResult SomeAction(int id)
{
   // ... 
}

[Route("foo/bar/{buzz:int}")]
public IHttpActionResult SomeAction(int id)
{
   // ... 
}

不会。

但问题是我得到了误报,因为在上面的第一个示例中,当我检查路由中的 {int:id} 是否与操作方法中的参数匹配时,参数中的类型名称是 @ 987654327@ 通过反射,我不知道如何让我的测试知道Int32int 相同。有办法吗?

【问题讨论】:

  • 这 100% 肯定不是手头的问题。你需要深入挖掘。
  • 您对路由配置中int 的含义做出了错误的假设。 introute constraint 的名称,它与 int 数据类型(别名为 System.Int32)的 C# 含义无关。此外,你应该是testing your routing config,而不是测试MVC框架是否工作(你应该假设它已经过测试)。

标签: c# .net asp.net-mvc reflection asp.net-mvc-routing


【解决方案1】:

我相信您编写这些单元测试是为了确保您配置的路由采用合适的方法,并确保在任何签名更改时您的测试套件也会迫使您更改路由约束。

因此,我假设您的第一种方法实际上是有效的,而您遇到的唯一问题是 if("int" == parameterType.Name) 写在您的测试方法的某处。

由于您希望您的测试知道“int”和“Int32”是相同的,因此您将需要这些别名的列表。可以找到here。此列表包含来自 .Net Framework 的类名以及 C# 内置别名。只需创建并填充字典并根据它进行检查。是的,您必须手动输入这些对。

请记住,一些路由约束不仅仅是一种数据类型(例如 max 或 length),您也可以针对相应的数据类型(在示例中为 int 和 string)测试它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2011-04-21
    • 2017-04-30
    • 2010-09-23
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多