猿问

类级别的 XUnit 理论类数据,而非方法

  1. 我使用 XUnit 在 C# 代码中运行单元测试。

  2. 我有许多抽象的单元测试类,它们采用一个标准的额外相当复杂的参数(与标准的 XUnit 测试类设置相比)。

  3. 该参数的值来自某个静态列表(为简单起见)。

  4. 我需要为该列表中参数的所有可能值运行所有相关的单元测试类,并且没有重复的样板代码

从某种意义上说,这等效于TheoryData,但应用于测试类级别而不是方法级别。在当前的 XUnit 框架内这可能吗?如果是,那么具体如何?


翻过高山走不出你
浏览 209回答 2
2回答

人到中年有点甜

您可以使用 IClassFixture。创建自定义的 TFixture 以将数据返回到您的测试类构造函数。namespace Xunit{&nbsp; &nbsp; public interface IClassFixture<TFixture> where TFixture : class&nbsp; &nbsp; {&nbsp; &nbsp; }}并且您的方法应该继承自定义装置public class ParameterizedTests: IClassFixture<TFixture>{&nbsp; &nbsp; public ParameterizedTests(TFixture fixture)&nbsp; &nbsp; {&nbsp; &nbsp; }&nbsp; &nbsp; public bool IsOddNumber(int number)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return number % 2 != 0;&nbsp; &nbsp; }&nbsp; &nbsp; [Theory]&nbsp; &nbsp; [ClassData(typeof(TestDataGenerator))]&nbsp; &nbsp; public void AllNumbers_AreOdd_WithClassData(int a, int b, int c, int d)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Assert.True(IsOddNumber(a));&nbsp; &nbsp; &nbsp; &nbsp; Assert.True(IsOddNumber(b));&nbsp; &nbsp; &nbsp; &nbsp; Assert.True(IsOddNumber(c));&nbsp; &nbsp; &nbsp; &nbsp; Assert.True(IsOddNumber(d));&nbsp; &nbsp; }}

泛舟湖上清波郎朗

您可以使用此处提到的 ClassData来完成您创建了如下所示的某种 Generator 类,并将 ClassData 夹具与 Theory 结合使用。public class TestDataGenerator : IEnumerable<object[]>{&nbsp; &nbsp; private readonly List<object[]> _data = new List<object[]>&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; new object[] {5, 1, 3, 9},&nbsp; &nbsp; &nbsp; &nbsp; new object[] {7, 1, 5, 3}&nbsp; &nbsp; };&nbsp; &nbsp; public IEnumerator<object[]> GetEnumerator() => _data.GetEnumerator();&nbsp; &nbsp; IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();}public class ParameterizedTests{&nbsp; &nbsp; public bool IsOddNumber(int number)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return number % 2 != 0;&nbsp; &nbsp; }&nbsp; &nbsp; [Theory]&nbsp; &nbsp; [ClassData(typeof(TestDataGenerator))]&nbsp; &nbsp; public void AllNumbers_AreOdd_WithClassData(int a, int b, int c, int d)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Assert.True(IsOddNumber(a));&nbsp; &nbsp; &nbsp; &nbsp; Assert.True(IsOddNumber(b));&nbsp; &nbsp; &nbsp; &nbsp; Assert.True(IsOddNumber(c));&nbsp; &nbsp; &nbsp; &nbsp; Assert.True(IsOddNumber(d));&nbsp; &nbsp; }}
随时随地看视频慕课网APP
我要回答