【问题标题】:Getting generic test data for generic unit tests获取通用单元测试的通用测试数据
【发布时间】:2013-01-02 18:48:57
【问题描述】:

我想重用通用测试,但是如何获取通用测试数据?


我编写了自己的IReadOnlyCollection<T> 接口,并编写了一些使用它的类。

由于该接口的方法和属性(例如ContainsCopyTo)应该始终完全相同,无论实现它的类如何,我想编写可以应用于任何实现的通用测试。使用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&lt;T&gt; 实现。

【问题讨论】:

  • 由于每个泛型类型 (T) 的实现都相同,所以我不会再测试这个类了。只写一个测试类,用一些通用参数(例如Object)测试你的ReadOnlyCollection&lt;T&gt;
  • 提到不同的TBitArrayStringCollection)的实现是不同的。

标签: c# unit-testing nunit test-data


【解决方案1】:

创建通过参数返回数据的数据提供者,并让参数为您需要的数据类型。您可以设置实现通用测试所需的数据类型。

【讨论】:

    【解决方案2】:

    您可以在IReadOnlyCollection&lt;T&gt; 类中创建返回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 };
        }
    
        ...
    }
    

    实际上,这个想法与您为创建集合实例实现的想法相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 2017-08-15
      相关资源
      最近更新 更多