You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:50:18