无法传递字符串数组

时间:2015-04-02 00:15:57

标签: c# .net unit-testing nunit

我想使用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)
{
}

4 个答案:

答案 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);   
  }
}

结果

enter image description here

此外,如果您想要引用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" };
    }
}