webapi控制器,名称为"<> c"

时间:2016-06-23 16:12:03

标签: c# .net unit-testing asp.net-web-api

我有一个单元测试,确保我的WebAPI控制器来自正确的基类型:

[TestMethod]
public void AllWebApiControllersShouldDeriveFromApiController()
{
    var controllers = Assembly.GetAssembly(typeof(ApiControllerBase)).GetTypes()
        .Where(t => t.Namespace == "Xxx.Web.Controllers")
        .ToList();

    controllers.Should().NotBeEmpty();

    foreach (var controller in controllers)
    {
        if (controller == typeof(ApiControllerBase)) continue;

        controller.Should().BeDerivedFrom<ApiControllerBase>();
    }
}
直到最近,它突然出现在控制器列表中的两个&#34; ghost&#34;控制器开始出现。它们看起来像某种通用(自动生成?)类型,它们正在使我的测试失败。这些是:

  

姓名=&#34;&lt;&gt; c&#34; FullName =   &#34; Xxx.Web.Controllers.ExistingControllerNameController + LT;&以及c&#34;

他们在上面的测试中失败了。这些是什么?哪儿来的?我怎么能摆脱他们?

N.B。测试在构建服务器上也失败了。清洁&amp;重建没有帮助。

之前的控制器代码:

 [HttpGet]
 [Route("api/things")]
 public IEnumerable<ThingDto> GetAll()
 {
     return service.GetAll();
 }

&安培;后:

 [HttpGet]
 [Route("api/things")]
 public IEnumerable<ThingDto> GetAll()
 {
     return service.GetAll().OrderBy(x => x.Description);
 }

2 个答案:

答案 0 :(得分:2)

&LT;&GT;在C#中的名称中不合法,这些是由编译器生成的类的名称。

使Where子句更严格,以排除编译器生成的类型。

var controllers = Assembly.GetAssembly(typeof(ApiControllerBase)).GetTypes()
        .Where(t => t.Namespace == "Xxx.Web.Controllers")
        .Where(t => !t.Name.Contains("<>")
        .ToList();

答案 1 :(得分:0)

根据评论中的建议,OrderBy子句中的Lambda导致出现这些编译器生成的类。我已经包含了CompilerGeneratedAttribute检查,以便从我的测试中排除这些:

[TestMethod]
public void AllWebApiControllersShouldDeriveFromApiController()
{
    var controllers = Assembly.GetAssembly(typeof(ApiControllerBase)).GetTypes()
        .Where(t => t.Namespace == "Xxx.Web.Controllers"
        && IsCompilerGenerated(t) == false).ToList();

    controllers.Should().NotBeEmpty();

    foreach (var controller in controllers)
    {
        if (controller == typeof(ApiControllerBase)) continue;

        controller.Should().BeDerivedFrom<ApiControllerBase>();
    }
}

private static bool IsCompilerGenerated(MemberInfo t)
{
    return Attribute.GetCustomAttribute(t, typeof(CompilerGeneratedAttribute)) != null;
}