我有以下测试:
[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'案例移到另一种测试方法。
不过,有没有办法让这个测试以与其他测试相同的方式运行?
答案 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属性。