2016-07-11 3 views
1

У меня есть тест-метод следующим образом:Передайте массив как значение атрибута

[TestCase(new string[] { "1", "2", "5" }, Result = true)] 
bool AllocateIDsTest1(IEnumerable<string> expected) 
{ 
    var target = ... 
    var actual = target.AllocateIDs(expected); 

    return actual.SequenceEqual(expected); 
} 

Однако я получаю компилятор ошибку:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.

Вероятно, компилятор не может различать между следующие конструкторы:

TestCase(params object[] args, Named Parameters); 

и

TestCase(object ob1, Named Paramaters); 

поскольку new string[] { "1", "2", "5" } может быть разрешен как для params object[], так и для object.

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

Как я могу предоставить массив строк для TestCase?

ответ

3

Я нашел решение с использованием Params-подход:

[TestCase("1", "2", "5", Result = true)] 
public bool AllocateIDsTest1(params string[] expected) 
{ 
    var target = ... 
    var actual = target.AllocateIDs(expected); 

    return actual.SequenceEqual(expected); 
} 
+0

Отлично обходной путь. Другой вариант - использовать TestCaseSource, см. Документы. –

+0

Даже не обходной путь. :-) Именно так предполагается использовать TestCase. Ошибка компилятора заключается не в том, что вы передали в массиве - это явно разрешено для атрибутов. Это потому, что вы просите конструктор атрибутов динамически создавать массив с помощью new. C# этого не допускает. – Charlie

+0

@Charlie Итак, как именно нужно назначать массив для работы атрибута, когда вы говорите «это явно разрешено по атрибутам»? Через поле 'static'? – HimBromBeere

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