获取通用单元测试的通用测试数据
本文关键字:测试数据 单元测试 获取 | 更新日期: 2023-09-27 17:54:15
我想重用通用测试,但如何获得通用测试数据?
我编写了自己的IReadOnlyCollection<T>
接口,并编写了一些使用它的类。
由于该接口的方法和属性(例如Contains
, 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...
}
现在我需要一些数据来测试。类型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>
的实现。
创建按参数返回数据的数据提供程序,并让参数为所需数据的类型。您可以设置在实现您的通用测试时所需的数据类型。
您可以创建抽象方法,在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 };
}
...
}
实际上,其思想与您为创建集合实例所实现的相同。