无法传递字符串数组

问题描述:

我想使用NUnit测试传递不同的测试参数。无法传递字符串数组

我可以通过整型数组,没问题,但是当我传递字符串数组时,它不起作用。

[TestCase(new[] { "ACCOUNT", "SOCIAL" })] 
public void Get_Test_Result(string[] contactTypes) 
{ 
} 

错误3的属性参数必须是常量表达式,属性参数的typeof运算 表达或数组创建表达式 类型... \ ContactControllerTests.cs 78个13单元测试

它当我使用字符串数组作为第二个参数时工作。

那么是什么原因?

[TestCase(0, new[] {"ACCOUNT", "SOCIAL"})] 
public void Get_Test_Result(int dummyNumber, string[] contactTypes) 
{ 
} 
+0

您是否尝试明确指定数组类型? '新字符串[] {...}'? – abatishchev 2015-04-02 05:45:12

+0

@abatishchev是的,但它不起作用。 – codebased 2015-04-02 05:59:31

+1

我明白了。游民。你使用的是什么版本的NUnit? – abatishchev 2015-04-02 06:01:03

考虑做如下

[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

+0

一般来说,如果答案包含解释,答案会更有帮助。 – 2015-04-02 04:39:49

+1

没有像自解释代码那样的东西,特别是当你处理像这样的语法怪癖时。 *特别是*当你完全脱离其中一个开放的假设时,并不能解释为什么问题首先出现。 – 2015-04-02 04:50:20

+0

@Saifur错误提供的参数数量 – codebased 2015-04-02 04:53:26

我相信这是一个情况下,超载分辨率&阵列协方差问题。

随着[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超出了我。

+0

所以可能的解决方案可能是'[TestCase((object)new string [] {“”})]'强制所需的过载... – 2015-04-02 18:23:15

+0

@AlexeiLevenkov:这就是我会做的。但我仍然无法弄清楚为什么编译器在使用string []作为属性构造函数参数时遇到了问题,尽管spec说它是有效的。 – 2015-04-02 19:23:15