C# 获取通用单元测试的通用测试数据

C# 获取通用单元测试的通用测试数据,c#,unit-testing,nunit,test-data,C#,Unit Testing,Nunit,Test Data,我想重用通用测试,但如何获取通用测试数据? 我编写了自己的IReadOnlyCollection接口,并编写了一些使用它的类 由于该接口的方法和属性(例如,包含,CopyTo)应始终完全相同,无论实现它的类是什么,因此我想编写可以应用于任何实现的通用测试。使用中建议的方法,我现在有以下几点: // Tests that must work for any type T: public abstract class IReadOnlyCollectionTests<T> {

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


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

由于该接口的方法和属性(例如,
包含
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...
}

BitArray
类似,我有一个
StringCollection
类(以及其他类),我想测试
IReadOnlyCollection
实现。

创建按参数返回数据的数据提供程序,并让参数成为您需要的数据类型。您可以设置实现泛型测试所需的数据类型。

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

见示例:

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

    ...
}
公共抽象类IReadOnlyCollectionTests
{
受保护的抽象IReadOnlyCollection CreateInstance(参数T[]数据);
受保护的抽象T[]GetData();
[测试]
public void包含_GivenExistingValue_ReturnsTrue()
{
//给定
T[]data=GetData();
T值=数据[1];
var sut=CreateInstance(数据);
...
}
}
[测试夹具]
公共类BitArrayROC:IReadOnlyCollectionTests
{
受保护的覆盖布尔[]GetData()
{
返回新的[]{true,false};
}
...
}

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

因为每个泛型类型(T)的实现都是相同的,所以我不会再测试这个类一次。只编写一个测试类,用一些泛型参数(例如
Object
)测试
ReadOnlyCollection
)它提到不同的
T
BitArray
StringCollection
)的实现是不同的。
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 };
    }

    ...
}