2015-04-02 68 views
8

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

回答

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

+0

一般來說,如果答案包含解釋,答案會更有幫助。 – 2015-04-02 04:39:49

+1

沒有像自解釋代碼那樣的東西,特別是當你處理像這樣的語法怪癖時。 *特別是*當你完全脫離其中一個開放的假設時,並不能解釋爲什麼問題首先出現。 – 2015-04-02 04:50:20

+0

@Saifur錯誤提供的參數數量 – codebased 2015-04-02 04:53:26

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

+0

所以可能的解決方案可能是'[TestCase((object)new string [] {「」})]'強制所需的過載... – 2015-04-02 18:23:15

+0

@AlexeiLevenkov:這就是我會做的。但我仍然無法弄清楚爲什麼編譯器在使用string []作爲屬性構造函數參數時遇到了問題,儘管spec說它是有效的。 – 2015-04-02 19:23:15