2011-08-22 3 views
2

코딩 표준을 보장하기 위해 리플렉션을 사용하여 아무것도 잘못되지 않았 음을 확인하는 몇 가지 단위 테스트가 있습니다. 이 같은 그 모습 중 하나Teamcity는 DataOnStack 구조체를 추가하여 내 어셈블리를 수정합니다.

[Test] 
public void All_structs_should_be_immutable() 
{ 
    var mutableStructs = typeof (Product).Assembly 
     .GetTypes() 
     .Where(type => 
       type.IsValueType && !type.IsCompilerGenerated() && 
       !type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).All(
       field => field.IsInitOnly)) 
     .OrderBy(type => type.FullName); 

    foreach (var mutableStruct in mutableStructs) 
    { 
     Console.WriteLine(mutableStruct.FullName); 
    } 

    Assert.AreEqual("", string.Join(", ", mutableStructs.Select(x => x.FullName).ToArray())); 
    Assert.AreEqual(0, mutableStructs.Count()); 
} 

제품 클래스는 JetBrains의/인 TeamCity과 아무 상관이 내 자신의 조립에 있습니다.

Resharper로 테스트를 실행할 때 잘 작동합니다. 그러나 Teamcity에서 실행하면이 오류가 발생합니다.

Test(s) failed. Expected string length 0 but was 51. Strings differ at index 0.

Expected:

But was: "JetBrains.Profiler.Core.Instrumentation.DataOnStack"

-----------^

at NUnit.Framework.Assert.That(Object actual, IResolveConstraint expression, String message, Object[] args)

at NUnit.Framework.Assert.AreEqual(Object expected, Object actual)

at Litium.Kamakura.UnitTest.CodingStandards.ImmutableStructs.All_structs_should_be_immutable() in c:\TeamCity\buildAgent\work\99395abb82d2a3b3\Test\Litium.Kamakura.UnitTest\CodingStandards\ImmutableStructs.cs:line 26

------- Stdout: -------

JetBrains.Profiler.Core.Instrumentation.DataOnStack

Teamcity가 내 어셈블리를 수정하는 방법과 그 이유는 무엇입니까?

+0

당신의 변경 가능한 구조체 컬렉션이 실제로 데이터로 채워지거나 비어있는 채로 남아 있습니까? – Tigran

+0

하나의 유형이 있습니다. "JetBrains.Profiler.Core.Instrumentation.DataOnStack"구조체가 있습니다. – Allrameest

+0

TeamCity 6.5에서도 같은 결과가 나타납니다. 클래스 만 찾고 있으므로 type.IsClass를 사용하여 TeamCity 구조 인 DataOnStack을 필터링 할 수있었습니다. – jaminto

답변

4

Teamcity의 테스트 러너 (NUnit 테스트 러너)가 dotCover/dotTrace와 함께 실행되도록 구성되어있는 것처럼 보입니다. 위의 프로파일 러 중 하나가 코드를 편집했습니다 (코드가 .net 프로파일 러이고 JIT 컴파일 타임에 코드를 삽입 할 수 있음을 기억하십시오).

bug track에 따르면 Jetbrains는이 구조를 사용하므로 제거하지 않으므로 해결 방법을 사용해야합니다.

도 참조하십시오. Teamcity documentation - 다른 주자와 달리 실행하거나 NCover를 사용하여 수신 범위를 수집하거나 전체 수신 범위를 사용하지 않도록 설정할 수 있습니다.

관련 문제