类级别的非XUnit Theory数据,不是方法

时间:2018-08-15 02:33:56

标签: c# xunit xunit.net

  1. 我使用XUnit在C#代码中运行单元测试。
  2. 我有许多抽象的单元测试类,它们采用一个标准的额外相当复杂的参数(与标准XUnit测试类的设置相比)。
  3. 该参数的值来自某个静态列表(为简化示例)。
  4. 我需要针对该列表中所有可能的参数值以及没有重复的样板代码,运行所有相关的单元测试类。

从某种意义上讲,它等效于TheoryData,但适用于测试类级别而不是方法级别。在当前的XUnit框架中这可能吗?如果是,那么到底如何?

2 个答案:

答案 0 :(得分:0)

您可以使用here所述的ClassData做到这一点

您将创建如下所示的Generator类,并将ClassData夹具与Theory配合使用。

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

答案 1 :(得分:0)

您可以使用IClassFixture。创建一个自定义的TFixture以将数据返回到您的测试类构造函数。

git rebase --root --exec "git commit --amend --reset-author --no-edit"

您的方法应该继承自定义的固定装置

namespace Xunit
{
    public interface IClassFixture<TFixture> where TFixture : class
    {
    }
}