您实际上并不是在编写单元测试。您正在测试中编写一些代码并希望对其进行验证。通常,您会在其他地方尝试验证方法。假设您这样做:
public static Numbers
{
public static IEnumerable<int> FilterAndSortOdds(IEnumerable<int> source)
=> source.Where(i => (i%2) != 0).OrderBy(i => i);
}
然后,您将验证从您的测试中调用该方法。例如,一个简单的Fact 可能如下所示:
public class TestClass
{
[Fact]
public void CanSortAndFilterOddNumbers()
{
var source = new[] { 1, 2, 9, 4, 5 };
var expected = new[] { 1, 5, 9 };
var actual = Numbers.FilterAndSortOdds(source).ToArray();
Assert.Equal(expected, actual);
}
}
现在,如果您想将其转化为理论,您有几个选择。您可以使用InlineData(通过创建新数组)
public class TestClass
{
[Theory]
[InlineData(new[] { 1, 2, 9, 4, 5 }, new[] { 1, 5, 9 })]
[InlineData(new[] { 2, 1 }, new[] { 1 })]
[InlineData(new[] { 9, 7, 5, 3, 1 }, new[] { 1, 3, 5, 7, 9 })]
public void CanSortAndFilterOddNumbers(int[] source, int[] expected)
{
var actual = Numbers.FilterAndSortOdds(source).ToArray();
Assert.Equal(expected, actual);
}
你也可以使用MemberData:
public class TestClass
{
[Theory]
[MemberData(nameof(PassingData)]
public void CanSortAndFilterOddNumbers(int[] source, int[] expected)
{
var actual = Numbers.FilterAndSortOdds(source).ToArray();
Assert.Equal(expected, actual);
}
public static IEnumerable<object[]> PassingData => new List<object[]> {
/* Test 1 */
new object[] { new[] { 1, 2, 9, 4, 5 }, new[] { 1, 5, 9 } },
/* Test 2 */
new object[] { new[] { 2, 1 }, new[] { 1 } },
/* Test 3 */
new object[] { new[] { 9, 7, 5, 3, 1 }, new[] { 1, 3, 5, 7, 9 } }
};
}
对于强类型的东西,我们可以使用 ClassData 和 TheoryData<> 助手:
public class TestClass
{
[Theory]
[ClassData(nameof(PassingOdds)]
public void CanSortAndFilterOddNumbers(IEnumerable<int> source, int[] expected)
{
var actual = Numbers.FilterAndSortOdds(source).ToArray();
Assert.Equal(expected, actual);
}
}
public class PassingOdds :
TheoryData</*arg1*/IEnumerable<int>, /*arg2*/int[]>
{
public PassingOdds()
{
/* Test 1*/
Add(new[] { 1, 2, 9, 4, 5 }, new[] { 1, 5, 9 });
/* Test 2 */
Add(new List<int> { 2, 1 }, new[] { 1 });
/* Test 3 */
Add(new[] { 9, 7, 5, 3, 1 }, new[] { 1, 3, 5, 7, 9 });
}
}
ClassData 也可用于类似于MemberData 的非泛型(基于IEnumerable<object[]>)模型。 Andrew Lock 有几个很棒的 blog posts 关于这个话题。您也可以在xUnit samples on github 中看到这一点。