XUnit - 混合理论数据机制,输入和预期数据

问题描述 投票:0回答:1

在使用XUnit创建Theory测试用例时,我希望能够包含每个案例的参数和预期结果。我使用了InlineData属性,但是对于繁重的配置加载,这不是最佳的,并且不允许重用。

[InlineData(1,2,3,4,5,6,7,...)]

因此,我已将测试配置移到单独的类中,现在使用MemberData和MemberType加载它们。

[Theory]
[MemberData(nameof(DataClass.Data), MemberType = typeof(DataClass))]
public void TestValidConfig(Configuration config)
{
    ...
}

但是,如果使用基本标签,我不能指定预期的结果,即

[InlineData("Input1", "Input2", "Input3", "ExpectedResult")]

我不想在配置数据中包含预期的结果,因为这将在多个测试中重复使用。

有没有人有这个挑战的解决方案?

因此,潜在的挑战是拥有复杂的测试数据,可以在多个地方使用,但随后想要分离预期的结果。因此,在计算器(错误示例)中,您可以拥有作为测试数据的数字列表。然后可以将这些传递到加法或乘法或减法测试中。这是我想要将输入和预期输出数据分开的地方。

c# xunit xunit.net
1个回答
1
投票

这是一个建议:

  1. 创建一个类来生成测试数据:
    internal static class TestData
    {
        public static IList<T> Get<T>(int count = 10)
        {
            // I'm using NBuilder here to generate test data quickly.
            // Use your own logic to create your test data.
            return Builder<T>.CreateListOfSize(count).Build();
        }
    }

现在,您的所有测试类都可以利用它来获取相同的测试数据集。所以,在你的数据类中,你会做一些事情

public class DataClass
{
    public static IEnumerable<object[]> Data()
    {
         return new List<object[]>
                {
                    new object[] { TestData.Get(), this.ExpectedResult() }
                };
    }
} 

现在,您可以使用原始方法:

[Theory]
[MemberData(nameof(DataClass.Data), MemberType = typeof(DataClass))]
public void TestValidConfig(Data input, Configuration expected)
{
    ...
}

如果您的测试没有改变输入数据,您可以将它们收集到夹具中并通过构造函数注入输入数据。这样可以加快测试速度,因为您不必为每次测试生成输入数据。查看shared context了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.