코딩 표준을 보장하기 위해 리플렉션을 사용하여 아무것도 잘못되지 않았 음을 확인하는 몇 가지 단위 테스트가 있습니다. 이 같은 그 모습 중 하나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가 내 어셈블리를 수정하는 방법과 그 이유는 무엇입니까?
당신의 변경 가능한 구조체 컬렉션이 실제로 데이터로 채워지거나 비어있는 채로 남아 있습니까? – Tigran
하나의 유형이 있습니다. "JetBrains.Profiler.Core.Instrumentation.DataOnStack"구조체가 있습니다. – Allrameest
TeamCity 6.5에서도 같은 결과가 나타납니다. 클래스 만 찾고 있으므로 type.IsClass를 사용하여 TeamCity 구조 인 DataOnStack을 필터링 할 수있었습니다. – jaminto