我想使用NUnit Test传递不同的测试参数。
我可以传递整数数组,没问题,但是当我传递字符串数组时它不起作用。
[TestCase(new[] { "ACCOUNT", "SOCIAL" })]
public void Get_Test_Result(string[] contactTypes)
{
}
错误3属性参数必须是常量表达式typeof 表达式或数组创建表达式的属性参数 type ... \ ContactControllerTests.cs 78 13 UnitTests
当我使用字符串数组作为第二个参数时,它可以工作。
那是什么原因?
[TestCase(0, new[] {"ACCOUNT", "SOCIAL"})]
public void Get_Test_Result(int dummyNumber, string[] contactTypes)
{
}
答案 0 :(得分:2)
我相信这是一个超载分辨率的案例。数组协方差问题。
使用[TestCase(new string[] { "" })]
编译器决定TestCase
构造函数的最佳重载是以params object[]
为参数的重载。这是因为由于数组协方差,编译器可以将string[]
分配给object[]
,因此这比string[]
到object
赋值(其他构造函数)更具体。
int[]
不会发生这种情况,因为co-variance does not apply to arrays of value types因此编译器被迫使用object
构造函数。
现在,为什么它决定new [] { "ACCOUNT", "SOCIAL" }
不是array creation expression of an attribute parameter type超出我的范围。
答案 1 :(得分:1)
正如k.m所说,我相信编译错误是由重载分辨率和数组协方差导致的,并且强制转换为对象的建议对我不起作用。
但是,指定参数名称(在TestCaseAttribute情况下为arg)可以解决过载解析中的混淆问题,因为您可以精确地指定所需的过载:
[TestCase(arg:new string[]{"somthing", "something2"})]
这为我编译并工作。
答案 2 :(得分:0)
考虑如下操作
[TestCase("ACCOUNT", "SOCIAL")]
public void Test1()
{
}
不确定您的测试是否与我的相似。但是我通过以下测试得到了预期的结果
[TestFixture]
public class TestCaseTest
{
[TestCase("ACCOUNT","SOCIAL")]
public void Get_Test_Result(String a, String b)
{
Console.WriteLine("{0},{1}",a,b);
}
}
结果
此外,如果您想要引用TestCaseAttribute
答案 3 :(得分:0)
使用TestCaseSource属性的另一种方法:
[TestCaseSource((typeof(AccountTypes))]
public void Get_Test_Result(string[] contactTypes)
{
}
public class AccountTypes : IEnumerable
{
public IEnumerator GetEnumerator()
{
yield return new string[] { "ACCOUNT", "SOCIAL" };
}
}