在NUnit TestCase中将单个值传递给params参数

时间:2012-03-03 21:33:12

标签: c# unit-testing nunit parameter-passing

我有以下测试:

[ExpectedException(typeof(ParametersParseException))]
[TestCase("param1")]
[TestCase("param1", "param2")]
[TestCase("param1", "param2", "param3", "optParam4", "optParam5", "some extra parameter")]
public void Parse_InvalidParametersNumber_ThrowsException(params string[] args)
{
    new ParametersParser(args).Parse();
}

第一个TestCase(显然)失败,出现以下错误:

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

我尝试用这个替换TestCase定义:

[TestCase(new[] { param1 })]

但现在我收到以下编译错误:

  

错误CS0182:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

我现在的解决方案是将'one parameter'案例移到另一种测试方法。

不过,有没有办法让这个测试以与其他测试相同的方式运行?

3 个答案:

答案 0 :(得分:8)

一种方法是使用TestCaseSource,并有一个返回每个参数集的方法,而不是使用TestCase。

答案 1 :(得分:3)

基于this answer回答问题' NUnit cannot recognize a TestCase when it contains an array',编译错误源于bug,可以使用命名语法克服测试用例,如下:

[ExpectedException(typeof(ParametersParseException))]
[TestCase(new[] { "param1"}, TestName="SingleParam")]
[TestCase(new[] { "param1", "param2"}, TestName="TwoParams")]
[TestCase(new[] { "param1", "param2", "param3", "optParam4", "optParam5"}, "some extra parameter", TestName="SeveralParams")]
public void Parse_InvalidParametersNumber_ThrowsException(params string[] args)
{
    new ParametersParser(args).Parse();
}

答案 2 :(得分:0)

尽管我不推荐这种方法,

这是在params参数之前使用伪对象参数,将单个参数传递给params数组的另一种方法。

请参见以下示例:

[ExpectedException(typeof(ParametersParseException))]
[TestCase(null, "param1")]
[TestCase(null, "param1", "param2")]
[TestCase(null, "param1", "param2", "param3", "optParam4", "optParam5", "some extra parameter")]
public void Parse_InvalidParametersNumber_ThrowsException(object _, params string[] args)
{
    new ParametersParser(args).Parse();
}

PS更好的方法是使用TestCaseSource属性。