“System.Int32”类型的对象无法转换为“System.Int32 []”类型

时间:2014-11-25 18:38:51

标签: c# nunit

我有一个像这样定义的方法

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关键字声明最后一个参数)。我试图避免显式传递数组。

3 个答案:

答案 0 :(得分:1)

试过以下内容:

[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测试适配器来运行。

答案 1 :(得分:1)

您的方法没有问题。实际问题在于来自NUnit框架的TestCaseAttribute:它不足以克服运行时限制。

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

UPD:基于提供的评论,我认为在最近的NUnit版本中很可能修复了这个错误

答案 2 :(得分:0)

你有没有尝试过:

[TestCase("test.doc", 1, new int[] { 3 }]