- 我使用XUnit来运行C#代码中的单元测试。
- 我有许多抽象的单元测试类,这些类需要一个比标准XUnit测试类设置更为复杂的参数。
- 该参数的值来自某个静态列表(为了简化例子)。
- 我需要运行所有相关的单元测试类,对于该列表中可能的所有参数值,并且不需要重复的样板代码。
从某种意义上说,这相当于TheoryData
,但是应用于测试类的级别,而不是方法的级别。在当前的XUnit框架中是否可能?如果是,那么怎么做呢?
public class TestDataGenerator : IEnumerable<object[]>
{
private readonly List<object[]> _data = new List<object[]>
{
new object[] {5, 1, 3, 9},
new object[] {7, 1, 5, 3}
};
public IEnumerator<object[]> GetEnumerator() => _data.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class ParameterizedTests
{
public bool IsOddNumber(int number)
{
return number % 2 != 0;
}
[Theory]
[ClassData(typeof(TestDataGenerator))]
public void AllNumbers_AreOdd_WithClassData(int a, int b, int c, int d)
{
Assert.True(IsOddNumber(a));
Assert.True(IsOddNumber(b));
Assert.True(IsOddNumber(c));
Assert.True(IsOddNumber(d));
}
}
namespace Xunit
{
public interface IClassFixture<TFixture> where TFixture : class
{
}
}
你的方法应该继承自定义的装置
public class ParameterizedTests: IClassFixture<TFixture>
{
public ParameterizedTests(TFixture fixture)
{
}
public bool IsOddNumber(int number)
{
return number % 2 != 0;
}
[Theory]
[ClassData(typeof(TestDataGenerator))]
public void AllNumbers_AreOdd_WithClassData(int a, int b, int c, int d)
{
Assert.True(IsOddNumber(a));
Assert.True(IsOddNumber(b));
Assert.True(IsOddNumber(c));
Assert.True(IsOddNumber(d));
}
}