我有一个单元测试,确保我的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);
}
答案 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;
}