2013-01-18 2 views
0

일반 테스트를 재사용하고 싶지만 어떻게 일반 테스트 데이터를 얻을 수 있습니까?일반 단위 테스트를위한 일반 테스트 데이터 얻기


나는 내 자신의 IReadOnlyCollection<T> 인터페이스를 쓰고, 그것을 사용하는 일부 클래스를 썼다.

해당 인터페이스의 메소드와 속성 (예 : Contains, CopyTo)은 구현 클래스에 관계없이 항상 똑같이 작동해야하므로 모든 구현에 적용 할 수있는 일반적인 테스트를 작성하고 싶습니다.

// Tests that must work for any type T: 
public abstract class IReadOnlyCollectionTests<T> 
{ 
    protected abstract IReadOnlyCollection<T> CreateInstance(params T[] data); 

    [Test] 
    public void Contains_GivenExistingValue_ReturnsTrue() 
    { 
     // Given 
     T[] data; // <-- Get some data? 
     T value = data[1]; 
     var sut = CreateInstance(data); 

     // When 
     bool result = sut.Contains(value); 

     // Then 
     Assert.IsTrue(result); 
    } 

    // 40 more such tests... 
} 

는 지금은 함께 테스트하기 위해 일부 데이터가 필요 this post에서 제안 된 접근 방식을 사용하여, 나는 이제 다음 있습니다. 유형 T은 부울 또는 문자열 등일 수 있습니다. 어떤 유형의 데이터에도 사용할 수있는 일반 데이터를 얻으려면 어떻게해야합니까? T? 그런데


: 내 BitArray 구현을위한 이와 같은 각 구현을위한 테스트 클래스를 파생하여이 일반적인 테스트를 실행합니다 (논리 값의 집합) : 유사

[TestFixture] 
public class BitArrayROC : IReadOnlyCollectionTests<bool> 
{ 
    protected override IReadOnlyCollection<bool> CreateInstance(params bool[] data) 
    { 
     return new BitArray(data); 
    } 
} 

BitArray에 이르기까지 IReadOnlyCollection<T> 구현을 테스트하려는 StringCollection 클래스가 있습니다.

+0

구현은 모든 일반 유형 (T)에 대해 ** 동일한 **이므로이 클래스를 한 번 더 테스트하지는 않습니다. 'ReadOnlyCollection '을 일반적인 일반 인자 (예 :'Object')로 테스트하는 하나의 테스트 클래스를 작성하십시오. –

+1

구현시 'T'('BitArray','StringCollection')마다 다름을 언급했습니다. –

답변

1

매개 변수별로 데이터를 반환하는 데이터 공급자를 만들고 필요한 데이터 형식을 매개 변수로 사용하십시오. 일반 테스트를 구현하는 데 필요한 데이터 유형을 설정할 수 있습니다.

0

클래스에 data을 반환하는 추상 메서드를 만들 수 있습니다. 그런 다음 파생 클래스에서 유형별 구현을 작성할 수 있습니다.

참조 예 :

public abstract class IReadOnlyCollectionTests<T> 
{ 
    protected abstract IReadOnlyCollection<T> CreateInstance(params T[] data); 

    protected abstract T[] GetData(); 

    [Test] 
    public void Contains_GivenExistingValue_ReturnsTrue() 
    { 
     // Given 
     T[] data = GetData(); 
     T value = data[1]; 
     var sut = CreateInstance(data); 

     ... 
    } 
} 

[TestFixture] 
public class BitArrayROC : IReadOnlyCollectionTests<bool> 
{ 
    protected override bool[] GetData() 
    { 
     return new[] { true, false }; 
    } 

    ... 
} 

사실, 아이디어는 수집 인스턴스 생성을 구현 한 것과 동일합니다.