2016-07-28 2 views
2

CA1822가 오류로 켜져있는 사용자 정의 RuleSet으로 작업하고 있습니다.CA1822가 Release Mode의 [TestMethod] async Task methods에 잘못 적용 되었습니까?

저는 TestMethod가 있습니다. 즉 비동기식이므로 Task를 반환합니다. 이 방법은 필드를 사용하지 않으므로 코드 분석 규칙 CA1822에 정적으로 표시하십시오. 그러나 MSTest는 정적 비동기 작업 메서드 (테스트 탐색기에 나열되지 않음)를 호출 할 수 없습니다. 코드 분석의 논리에 결함이있는 것 같습니다. 나는 C#에 상당히 익숙하다. 그래서 내가 할 수있는 한 최선을 다해 코드 분석을 따르려고 노력하고 있는데, 규칙을 어겨야한다고 생각할 때 억압을 넣는다. 그러나 이것은 규칙이 틀렸다고 생각한 것은 처음입니다.

[TestMethod] 
public async Task TestMethod1() 
{ 
    await Task.Delay(10); 
} 



Severity Code Description Project File Line Suppression State 
Error CA1822 The 'this' parameter (or 'Me' in Visual Basic) of 'UnitTest1.TestMethod1()' is never used. Mark the member as static (or Shared in Visual Basic) or use 'this'/'Me' in the method body or at least one property accessor, if appropriate. 

규칙과 관련하여 누락 된 것이 있습니까? 아니면 이것만으로도 시험을 거치지 않은 코너 경우입니까?

더 많은 조건을 시도해 보면 릴리스 모드에서만 문제가있는 것으로 보입니다. 디버그 모드에서는 절대로 CA1822에 플래그를 지정하지 않습니다. 내 testMethod가 비동기가 아닌 경우 디버그 또는 릴리스 모드에서는 규칙이 적용되지 않습니다.

그래서 저는 이것이 스튜디오 2015 엔터프라이즈 RC3에 언급되어야한다고 생각합니다.

저에게 그것이 RuleSet의 코너 케이스라고 제안했으나 다른 사람들이 생각하는 것을 듣고 싶습니다.

+1

디버그 및 릴리스가 약간 다른 코드를 생성합니다. 정말로 관심이 있다면 - 릴리스 코드의 IL을보고'async'에 대해 메소드를 다시 작성하는 방법을 살펴보십시오. 릴리스에서'this'의 사용법이 없다는 것을 알 수 있습니다. (자아 답답함으로 제공하는 다소 재미있는 정보 일 수도 있습니다.) –

+0

나는 당신이 뭔가있는 것 같지만, 이해 하기엔 충분하지 않습니다. 디버그 및 릴리스 IL에 대한 차이점을 살펴보면 디버그는 오브젝트를 확장하고 릴리스는 ValueType을 확장합니다. 좀 더 구체적으로, 디버그에서, 내 [TestMethod]는 클래스 UnitTestProject4.UnitTest1에 있지만 릴리스 모드에서는 UnitTestProject4.UnitTest1 값 유형입니다. 나는 그 의미를 정말로 이해하지 못한다. 그러나 나는 그것이 당신이 옳다고 생각한다. 이것이 중요한 차이점이다. –

답변

0

규칙은 성능 집합에서 나왔고 성능 관점에서는 규칙을 정적으로 만드는 것이 더 빠릅니다. 1000 가지 이유가있을 수 있습니다.이 경우 하나의 단위 테스트 방법이므로이 규칙을 적용하지 않을 수 있습니다.

저는 대부분의 프로젝트에서이 규칙을 직접 해제했습니다. 많은 경우에있어서, 비록 그것이 조금 더 빨리 실행 되더라도 그것은 나쁜 객체 지향 디자인으로 이끈다. 문서의 작은 말 :

경우에 따라 현재 개체 인스턴스에 액세스하지 못하는 것이 정확성 문제를 나타낼 수도 있습니다.

이 경우 적용되지 않지만 일반적으로 더 정확한 설명입니다.