前面介绍的数据提供者除了InlineData比较常用外,其它几个都不是很实用,因为数据和测试方法混合在一个类中,违反了职责单一的原则,最后一个看似比较好的解开了耦合,实际上却带来了更高的复杂度.这里介绍ClassDataAttribute,类数据提供者.
类数据提供者需要实现IEnumerable<Object[]>泛型接口,Xunit会自动的调用其GetEnumerator方法来遍历数据然后提供给测试类.
我们看以下数据提供类
public class MyDataClassProvider:IEnumerable<object[]> { public IEnumerator<object[]> GetEnumerator() { yield return new object[] {3, 4}; yield return new object[] {5, 9}; } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }以上类型的GetEnumerator继承自接口,我们这里只提供了一些简单数据,当然带可以编写更为复杂的数据提供逻辑,比如从数据库里遍历,然后转化为可遍历集合.
下面再看看它是如何被使用的.
[Theory] [ClassData(typeof(MyDataClassProvider))] public void Test1(int x,int y) { var result = x + y; Assert.Equal(x + y, result); }这里使用ClassData注解,传入一个type类型.运行的时候Xunit便可以给测试方法提供测试数据了