使用XUnit创建理论测试用例时,我希望能够同时包含每个案例的参数和预期结果。我已经使用了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")]
我不想在配置数据中包含预期结果,因为它将在多个测试中重复使用。
有人能解决这个挑战吗?
因此,潜在的挑战是拥有复杂的测试数据,这些数据可以在多个地方使用,但是想要分离预期的结果。因此,在计算器中(错误的示例),您可能具有作为测试数据的数字列表。然后可以将它们传递给加,乘或减测试。这是我要分离输入数据和预期输出数据的地方。
答案 0 :(得分: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,以了解更多信息。