类型为“System.Int32”的对象不能转换为类型“System.Int32[]”

本文关键字:Int32 类型 System 转换 对象 不能 | 更新日期: 2023-09-27 18:32:00

>我有一个定义如下的方法

public void test(string fileName, int totalObjects, params int[] objectsToTest)

我正在尝试像这样在我的 NUnit 测试类中使用它

[TestCase("test.doc", 1, 3)]
public void test(string fileName, int totalObjects, params int[] objectsToTest)

代码编译得很好,但是当 NUnit 测试运行器尝试执行测试时,我收到以下异常:

System.ArgumentException : Object of type 'System.Int32' cannot be converted to type 'System.Int32[]'.

如何消除错误并保持对方法参数使用TestCase语法测试的能力?

编辑:

我知道我可以传递一个数组(并且我不需要为此使用 params 关键字声明最后一个参数)。我试图避免显式传递数组。

类型为“System.Int32”的对象不能转换为类型“System.Int32[]”

你的方法没有问题。实际问题来自 NUnit 框架TestCaseAttribute:它不够智能,无法克服运行时限制。

在 CLR 运行时(和编译的代码中)没有"参数",只有相应的数组参数。通过在相应方法上定义实例来保存有关"参数"存在的信息ParamArrayAttribute。因此,NUnit 尝试将提供的参数作为参数应用于方法,但它不会检查ParamArrayAttribute是否在方法上定义,因此不会将最后一个参数包装到数组中。因此,您必须显式声明数组作为参数,而不是单个值。

UPD:根据提供的评论,我认为此错误很有可能在最近的 NUnit 版本中得到修复

刚刚尝试了以下操作:

[TestFixture]
public class tester
{
    [TestCase("test.doc", 1, 3)]
    [TestCase("test.doc", 1, 3, 4, 5, 6)]
    public void test(string filename, int totalObjects, params int[] objectsToTest)
    {
    }
}

两个测试都通过了,断点显示对象已正确传递。

使用 NUnit

2.6.3 和 .NET 4.5 以及扩展 NUnit 测试适配器运行。

你试过吗:

[TestCase("test.doc", 1, new int[] { 3 }]
相关文章: