如何在xUnit Theory中以InlineData传入string[][]类型参数?
如何在xUnit Theory中以InlineData传入string[][]类型参数?
兄弟,你遇到的这个问题我之前也踩过坑!核心原因是C#对属性的参数有严格的编译时限制——必须是常量表达式、typeof表达式或者符合特定要求的数组创建表达式,而你直接在[InlineData]里初始化二维字符串数组的写法,不属于这些合法范畴,所以才会触发CS0182错误。
最靠谱也最常用的解决方案是换用[MemberData]来替代[InlineData],它专门用来传递这种需要运行时初始化的复杂数据类型,步骤很简单:
- 先定义一个静态的方法(或者静态属性),返回
IEnumerable<object[]>类型,把你需要的string[][]数据包装在object[]里返回 - 在你的
[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
相关产品推荐
相关产品推荐

