2013-01-18 56 views
0

我想重用泛型測試,但是如何獲得通用測試數據?獲得通用單元測試的通用測試數據


我寫我自己的IReadOnlyCollection<T>接口,並寫了使用它的一些類。由於該接口的方法和屬性(例如Contains,CopyTo)應該始終如一地工作,無論實現它的類如何,我都希望編寫可應用於任何實現的通用測試。使用在this post提出的辦法,我現在有以下幾點:

// 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... 
} 

現在我需要一些數據來測試。類型T可能是布爾值,或字符串,或任何東西。 如何獲得一些適用於任何類型T的通用數據?


順便說一句:我會通過獲取一測試類每個實現的,像這樣的對我BitArray實現運行這個通用測試(一個布爾值的集合):

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

類似到BitArray,我有一個StringCollection類(等),我想測試IReadOnlyCollection<T>實現。

+0

由於實現對於每個泛型類型(T)都是** **,所以我不會再測試這個類。只寫一個測試類來測試你的'ReadOnlyCollection '''有一些泛型參數(例如'Object') –

+1

它提到了不同的'T'('BitArray','StringCollection')實現是不同的。 –

回答

1

創建數據提供程序,它通過參數返回數據,並讓參數成爲您需要的數據類型。您可以設置實施普通測試所需的數據類型。

0

您可以創建抽象方法,該方法返回IReadOnlyCollection<T>類中的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 }; 
    } 

    ... 
} 

其實,這種想法是一樣的,你已經收集實例創建實施。