0

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


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

由于该接口的方法和属性(例如ContainsCopyTo)无论实现它的类如何都应该始终完全相同,因此我想编写可以应用于任何实现的通用测试。使用这篇文章中建议的方法,我现在有以下内容:

// 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>实现的类(以及其他类)。

4

2 回答 2

1

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

于 2013-01-18T23:54:07.460 回答
0

data您可以创建在IReadOnlyCollection<T>类中返回的抽象方法。然后在派生类中,您可以编写特定于类型的实现。

参见示例:

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 };
    }

    ...
}

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

于 2013-01-19T09:21:54.830 回答