2017-12-24 23 views
3

나는 SUT 유형 외에 여러 가지 유사한 테스트 클래스가있는 IEquatable<T>을 구현하는 많은 모델 모음을 가지고 있습니다. 이 테스트는 테스트중인 모델에 의해 구현 된 구현 및 기타 공통적 인 측면을 검증합니다.제네릭이없는 테스트 클래스 단순화

추상 제네릭 테스트 클래스를 사용하면 많은 작업을 수행 할 수 없으며 컴파일러 과부하 해결 방법이 연산자에서 느슨해 지므로 어쨌든 각 유형에 대해 파생 테스트 클래스를 구현해야합니다.

속성을 사용하면 파생 테스트 클래스가 필요 없지만 연산자의 컴파일 시간 과부하 해결 방법은 그대로 유지됩니다.

연산자와 컴파일 시간 과부하 해결을 유지하고 테스트 메서드를 호출하는 개체의 단일 컬렉션 (형식이든 아니든)이있는 다른 접근 방법이 있습니까? 예 : InlineData 그들이 (단지 제네릭 형식 매개 변수를 사용)하지 않는만큼 아래의 예에서

, 나는 MemberData 사용하지만 ==!= 사업자 및 시험 방법 서명을 호출 반사를 사용해야하는 것은 최적 미만.

[Theory] 
[MemberData(nameof(GetModelTypes))] 
public void MyTest<T>(T _) 
    where T : class, new() 
{ 
    var fixture = new Fixture().Customize(new AutoMoqCustomization()); 
    // Add any known type customization's... 

    T t = fixture.Create<T>(); 
    // Implement remaining generic test body. 
} 

public static IEnumerable<object[]> GetModelTypes() => 
{ 
    new object[] {new ModelA()}, 
    new object[] {new ModelB()}, 
    /* ... */ 
} 

누구나 객체 컬렉션을 유지 관리하고 컴파일 시간 과부하 해결 방법을 테스트 할 수있는 방법을 알고 있습니까?

답변

1

할 수 있습니다 write generic unit test classes with xUnit.net : 비슷한 보이는 시험의 군중이있는 경우, 그것은 AutoFixture.Idioms에보고 가치, 특히 그 IdiomaticAssertion 기본 클래스가 될 수 있습니다 말했다

public abstract class ModelTests<T> 
{ 
    [Fact] 
    public void MyTest() 
    { 
     var fixture = new Fixture(); 
     var sut = fixture.Create<T>(); 

     // The rest of the test goes here... 
    } 

    // More tests go here... 
} 

public class ModelATests : ModelTests<ModelA> { } 
public class ModelBTests : ModelTests<ModelB> { } 

.

+0

좋아, 그게 못생긴 테스트 서명을 좋아하지 않았으니 그것을 향상시킵니다. 지금 나는'op_Equality'와'op_Inequality' 멤버를 얻기 위해 리플렉션을 사용합니다. 그래서 나는 그들이 유효한 결과를 내고, 거기에 단순화에 대한 생각을 내릴 수 있습니까? 나는 지금 '관용적 유인물'을 조사하고있다. – Ritmo2k

+0

@ Ritmo2k 네, F #에서 테스트를 작성하고 일반적인 제약 조건을 사용할 수 있다고 생각합니다. C#에서는 운이 나쁘다고 생각합니다. –

1

우선, 다른 동작을 테스트하기위한 단일 정적 수집을 갖는 것은 자살의 일종입니다. 너 자신을 쏘지 마. 둘째로, 현재 특성을 가지고 있다는 사실이 당신에게 반사를 일으킬 수있는 힘을 준다는 것을 제외하고는 달성하려는 시도가 무엇인지 분명하지 않습니다. 귀하의 질문에 제네릭을 모두 반영하는 것에 관한 것이라면 실제로 가능합니다. typeof(GenericType<>).MakeGenericType(...)과 같은 것을 확인하십시오. 이 같은

+0

간략화를위한 요구 사항은 각 테스트 클래스가 형식 선언을 제외하고 동일한 줄에 대한 줄임을 의미합니다. 코드 중복을 제외하고 유형별로 하나의 파일 대 하나의 유형을 유지 관리하는 데 많은 오버 헤드가 있습니다. MemberData는이를 허용하지만 구현은 최적이 아닙니다. – Ritmo2k

+0

유형의 차이만으로 정확히 동일한 것을 얻은 경우 클래스를 일반으로 업그레이드하십시오. 그럴 수 없니? – 52hertz

+0

설명을 제공하기 위해 질문을 업데이트했습니다. – Ritmo2k