Xunit has a nice feature:您可以使用Theory
属性创建一个测试,并将数据放入InlineData
属性中,xUnit会生成许多测试并将其全部测试。
我想要这样的东西,但是我方法的参数不是“简单数据”(例如string
,int
,double
),而是我的类(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/