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

如何在xUnit Theory中以InlineData传入string[][]类型参数?

如何在xUnit Theory中以InlineData传入string[][]类型参数?

兄弟,你遇到的这个问题我之前也踩过坑!核心原因是C#对属性的参数有严格的编译时限制——必须是常量表达式、typeof表达式或者符合特定要求的数组创建表达式,而你直接在[InlineData]里初始化二维字符串数组的写法,不属于这些合法范畴,所以才会触发CS0182错误。

最靠谱也最常用的解决方案是换用[MemberData]来替代[InlineData],它专门用来传递这种需要运行时初始化的复杂数据类型,步骤很简单:

  1. 先定义一个静态的方法(或者静态属性),返回IEnumerable<object[]>类型,把你需要的string[][]数据包装在object[]里返回
  2. 在你的[Theory]测试方法上标注[MemberData(nameof(你的数据方法/属性名))]

给你写个具体的代码示例,一看就懂:

// 定义测试数据:静态方法返回需要的二维数组
public static IEnumerable<object[]> TestStringArrays()
{
    yield return new object[]
    {
        new string[][] 
        { 
            new string[] { "" }, 
            new string[] { "" } 
        }
    };
    // 还可以在这里添加更多测试用例
}

// 测试方法
[Theory]
[MemberData(nameof(TestStringArrays))]
public void MyTest(string[][] inputArrays)
{
    // 这里写你的测试逻辑,比如验证数组的长度、内容等等
    Assert.Equal(2, inputArrays.Length);
}

如果你觉得写方法有点麻烦,也可以用静态属性的方式来定义数据,写法更简洁:

public static IEnumerable<object[]> TestStringArrays => new List<object[]>
{
    new object[]
    {
        new string[][] { new string[] { "test1" }, new string[] { "test2" } }
    }
};

要是你实在想尽量贴近InlineData的写法,其实还有个小技巧:把二维数组拆成多个一维数组,在测试方法里再组合回去,但这种写法可读性差,还容易出错,真心不推荐。

总的来说,MemberData是处理这种复杂参数场景的标准方案,比硬凑InlineData要靠谱得多!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 08:33:00