我有一个像这样定义的方法
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关键字声明最后一个参数)。我试图避免显式传递数组。
答案 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 }]