Xunit has a nice feature:您可以使用Theory属性创建一个测试,并将数据放入InlineData属性中,xUnit会生成许多测试并将其全部测试。

我想要这样的东西,但是我方法的参数不是“简单数据”(例如stringintdouble),而是我的类(class)列表:

public static void WriteReportsToMemoryStream(
    IEnumerable<MyCustomClass> listReport,
    MemoryStream ms,
    StreamWriter writer) { ... }

最佳答案

XUnit中有许多xxxxData属性。例如,查看PropertyData属性。

您可以实现一个返回IEnumerable<object[]>的属性。然后,此方法生成的每个object[]将被“解压缩”,作为对[Theory]方法的单个调用的参数。

另一个选项是ClassData,它的工作原理相同,但是可以轻松地在不同类/命名空间中的测试之间共享“生成器”,并且还可以将“数据生成器”与实际测试方法分开。

参见these examples from here:

PropertyData示例

public class StringTests2
{
    [Theory, PropertyData(nameof(SplitCountData))]
    public void SplitCount(string input, int expectedCount)
    {
        var actualCount = input.Split(' ').Count();
        Assert.Equal(expectedCount, actualCount);
    }

    public static IEnumerable<object[]> SplitCountData
    {
        get
        {
            // Or this could read from a file. :)
            return new[]
            {
                new object[] { "xUnit", 1 },
                new object[] { "is fun", 2 },
                new object[] { "to test with", 3 }
            };
        }
    }
}

ClassData示例
public class StringTests3
{
    [Theory, ClassData(typeof(IndexOfData))]
    public void IndexOf(string input, char letter, int expected)
    {
        var actual = input.IndexOf(letter);
        Assert.Equal(expected, actual);
    }
}

public class IndexOfData : IEnumerable<object[]>
{
    private readonly List<object[]> _data = new List<object[]>
    {
        new object[] { "hello world", 'w', 6 },
        new object[] { "goodnight moon", 'w', -1 }
    };

    public IEnumerator<object[]> GetEnumerator()
    { return _data.GetEnumerator(); }

    IEnumerator IEnumerable.GetEnumerator()
    { return GetEnumerator(); }
}

关于c# - 将复杂的参数传递给[理论],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51540009/

10-13 06:01