2015-04-02 3 views
8

Я хочу передать различные тестовые параметры, используя NUnit Test.Не удалось передать строковый массив

Я могу передать целочисленный массив, без проблем, но когда я передаю строковый массив, он не работает.

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

Ошибка 3 Аргумент атрибут должен быть постоянным выражением, TypeOf или выражение создания массива выражение параметра атрибута типа ... \ ContactControllerTests.cs 78 13 UnitTests

It работает, когда я использую строковый массив в качестве второго аргумента.

В чем причина?

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

Вы пробовали указать тип массива явно? 'new string [] {...}'? – abatishchev

+0

@abatishchev Да, но это не сработает. – codebased

+1

Я вижу. Облом. Какую версию NUnit вы используете? – abatishchev

ответ

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

Как правило, ответы гораздо полезнее, если они содержат объяснение. –

+1

Нет такого понятия, как код без объяснения причин, особенно когда вы имеете дело с синтаксическими причудами, подобными этому. * Особенно, когда вы полностью отходите от одной из исходных предположений и не объясняете, почему проблема возникла в первую очередь. –

+0

@Saifur Неправильное количество аргументов – codebased

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 [] {" "})]' для принудительной перегрузки ... –

+0

@AlexeiLevenkov: вот что я сделал бы. Но я до сих пор не могу понять, почему компилятор имеет проблемы со строкой [] как аргумент конструктора атрибутов, хотя spec говорит, что он действителен. –

Смежные вопросы