2016-06-23 2 views
1

내가 단위 테스트 내 WebAPI 컨트롤러가 올바른 기본 형식에서 파생 확인이 :webapi 컨트롤러 "<> C"

[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>(); 
    } 
} 
은 최근까지 잘 작동했다

때 목록에 갑자기 관제사의 2 개의 "유령"관제사는 나타나는 것을 시작했다. 그들은 일종의 일반 (자동 생성?) 유형처럼 보이며 테스트에 실패합니다. 이들은 = "<> C"하면 FullName = 위의 "Xxx.Web.Controllers.ExistingControllerNameController + <> C"

그들은 실패하고 내 테스트

이름입니다. 그들은 무엇인가? 저들은 어디서 왔어요? 어떻게 그들을 제거 할 수 있습니까?

N.B. 테스트는 빌드 서버에서도 실패합니다. Clean & 재생성이 도움이되지 않았습니다.

컨트롤러 코드 전에 :

[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

확인 : 내 테스트에서 다음을 제외 할 CompilerGeneratedAttribute 검사를 포함했다. 관련된 클래스가 무엇인지 모른 채 도움을받는 것은 불가능합니다. –

+2

여러 가지 이유로 생성되는 컴파일러 생성 클래스입니다. 그냥 [유형에 대한'CompilerGenerated' 속성에 대한 체크를 추가하십시오] (http://stackoverflow.com/questions/6418779). –

+0

@DStanley 네 말이 맞아, 왜 갑자기 왜 나타나기 시작했는지 이해하고 싶니? – Tsar

답변

0

OrderBy 절에 람다 이러한 컴파일러 생성 된 클래스를 표시 발생했습니다. 소스 제어에 어떤 변화

[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; 
} 
2

<> C#에서 이름을 정당하지 않은, 사람들은 컴파일러에 의해 생성 된 클래스의 이름입니다.

Where 절을 컴파일러 생성 형식을 제외하도록 더 엄격하게 지정하십시오. 의견의 제안으로 당

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

이름에'<>'를 사용하는 것이 _ 구현 _ 세부 사항 _이라는 것에주의해야합니다. 미래의 컴파일러가 그 접두사를 사용할 것이라는 보장은 없습니다. –

+0

네, 맞습니다. 당신이 제안한대로'CompilerGenerated' 속성을 검사하는 것이 더 좋습니다. –

관련 문제