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