XUnit中有许多xxxxData
属性。例如,可以查看MemberData
属性。
您可以实现一个返回IEnumerable<object[]>
的属性。此方法生成的每个object[]
将被“解包”为单个调用您的[Theory]
方法的参数。
请参见这里的示例
以下是一些示例,仅供快速查看。
MemberData示例:就在这里手边
public class StringTests2
{
[Theory, MemberData(nameof(SplitCountData))]
public void SplitCount(string input, int expectedCount)
{
var actualCount = input.Split(' ').Count();
Assert.Equal(expectedCount, actualCount);
}
public static IEnumerable<object[]> SplitCountData =>
new List<object[]>
{
new object[] { "xUnit", 1 },
new object[] { "is fun", 2 },
new object[] { "to test with", 3 }
};
}
XUnit < 2.0:另一种选项是 ClassData
,它的工作方式相同,但允许在不同的类/命名空间中轻松共享“生成器”,同时将“数据生成器”与实际测试方法分离。
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(); }
}
XUnit >= 2.0:现在不再使用ClassData
,而是有一个[MemberData]的“重载”,可以使用其他类的静态成员。下面的示例已更新以使用它,因为XUnit<2.x现在相当古老。
另一个选项是ClassData
,它的工作方式相同,但允许在不同的类/命名空间中轻松共享“生成器”,并将“数据生成器”与实际测试方法分离。
MemberData 示例:请查看其他类型
public class StringTests3
{
[Theory, MemberData(nameof(IndexOfData.SplitCountData), MemberType = 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[]>
{
public static IEnumerable<object[]> SplitCountData =>
new List<object[]>
{
new object[] { "hello world", 'w', 6 },
new object[] { "goodnight moon", 'w', -1 }
};
}
免责声明 :)
最后检查于2021年9月3日,使用C# 5.0和xunit 2.4.1在dotnetfiddle.net上进行测试时失败了。我无法将测试运行器混合到那个代码片段中。但至少它编译得很好。请注意,这是几年前编写的,事情有所变化。我根据我的直觉和评论进行了修复。因此..它可能包含难以发现的拼写错误、明显的bug,在运行时会立即出现,并且有牛奶和坚果的痕迹。