如何在Xunit中通过ClassData传递两个List参数进行方法测试
解决Xunit多参数测试的ClassData传参问题
你的问题核心是每个测试用例的object[]需要包含测试方法所需的所有参数,而不是分开返回单个参数的数组。下面是修正后的代码:
修正后的CompetitionsTestData类
public class CompetitionsTestData : IEnumerable<object[]> { public IEnumerator<object[]> GetEnumerator() { // 每个object[]包含两个元素:第一个是List<List<string>>,第二个是List<int> yield return new object[] { // 第一个参数:比赛列表 new List<List<string>>() { new List<string>{"HTML", "C#"}, new List<string>{"C#", "PYTHON"}, new List<string>{"PYTHON", "HTML"} }, // 第二个参数:比赛结果列表(对应每场比赛的胜者,数值根据业务逻辑调整) new List<int>{0, 1, 1} }; // 可添加更多测试用例 yield return new object[] { new List<List<string>>() { new List<string>{"JAVA", "PYTHON"}, new List<string>{"PYTHON", "JS"} }, new List<int>{1, 0} }; } // 必须实现非泛型的IEnumerable.GetEnumerator,显式实现即可 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } }
关键说明
- 每个
yield return的object[]长度要和测试方法的参数数量一致,顺序也要严格对应:第一个元素匹配测试方法的List<List<string>> x,第二个元素匹配List<int> y。 - 你之前的代码分开返回两个单元素数组,Xunit会判定为两个仅传入第一个参数的测试用例,导致第二个参数无法匹配,因此必须把一组测试的两个参数放在同一个
object[]中。 - 必须补充实现非泛型的
GetEnumerator方法,这是IEnumerable<object[]>继承链的强制要求,否则会编译报错。
测试方法无需修改
你的测试方法代码是正确的,保持原样即可:
[Theory] [ClassData(typeof(CompetitionsTestData))] public void TestMethod(List<List<string>> x, List<int> y) { Console.WriteLine(x); Console.WriteLine(y); string result = TournamentWinner.GetTournamentWinner(x, y); Assert.Equal("PYTHON", result.ToUpper()); }
内容的提问来源于stack exchange,提问作者user3921104
相关产品推荐
相关产品推荐

