单元测试中如何将二维数组int[,]设为测试方法参数?
解决MSTest中二维数组作为DataRow参数的问题
你遇到的这个错误完全是因为C#对属性参数的严格限制:属性的实参必须是编译时常量表达式、typeof表达式,或者符合属性参数类型的一维数组创建表达式。多维数组(比如int[,])没法直接作为DataRowAttribute的参数传递,因为它不符合这些规则。
下面给你两个实用的解决办法,优先推荐第一个:
方法1:使用[DynamicData]特性(MSTest官方支持)
这是最优雅的解决方案,DynamicData允许你从静态方法动态生成测试数据,彻底避开属性参数的常量限制。
示例代码如下:
// 定义静态方法提供测试用例数据 public static IEnumerable<object[]> GetTwoDimArrayTestData() { // 每个yield return对应一个测试用例,返回的object数组里放你的测试参数 yield return new object[] { new int[,] { {0, 0}, {0, 0} } }; yield return new object[] { new int[,] { {1, 2}, {3, 4} } }; // 可以继续添加更多测试用例 } // 测试方法绑定上面的数据源 [TestMethod] [DynamicData(nameof(GetTwoDimArrayTestData), DynamicDataSourceType.Method)] public void TestMethod(int[,] expected) { // 在这里写你的测试逻辑 // 比如验证目标方法返回的二维数组和expected一致 }
方法2:改用交错数组(int[][])适配DataRow
如果不想引入DynamicData,也可以把多维数组换成交错数组(一维数组的数组)——因为一维数组的创建表达式是允许作为属性参数的。不过需要调整测试方法的参数类型,或者在方法内部做类型转换:
[DataRow(new int[][] { new int[] {0, 0}, new int[] {0, 0} })] [DataRow(new int[][] { new int[] {1, 2}, new int[] {3, 4} })] [TestMethod] public void TestMethod(int[][] expected) { // 如果业务逻辑需要int[,],可以在这里做转换 int[,] multiDimArray = new int[expected.Length, expected[0].Length]; for (int i = 0; i < expected.Length; i++) { for (int j = 0; j < expected[i].Length; j++) { multiDimArray[i, j] = expected[i][j]; } } // 后续测试逻辑 }
简单总结:优先选方法1,它不仅能解决二维数组的问题,还支持更复杂的测试数据构造(比如从文件、数据库读数据),代码也更清晰。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

