2015-04-02 31 views
8

Chcę przekazać różne parametry testowe za pomocą testu NUnit.Nie można przekazać tablicy ciągów znaków

Potrafię przekazać tablicę całkowitą, nie ma problemu, ale kiedy przekazuję ciąg znaków, to nie działa.

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

błędu 3 Argument atrybut musi być stała Wyrażenie typeof ekspresji lub tworzenie macierzy ekspresji z parametrem atrybutu typu ... \ ContactControllerTests.cs 78 13 UnitTests

ramę działa, gdy używam tablicy łańcuchowej jako drugiego argumentu.

Jaki jest tego powód?

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

Czy próbowałeś jawnie określić typ tablicy? 'nowy ciąg [] {...}'? – abatishchev

+0

@abatishchev Tak, ale to nie działa. – codebased

+1

Rozumiem. Bummer. Jakiej wersji NUnit używasz? – abatishchev

Odpowiedz

0

rozważenie następująco

[TestCase("ACCOUNT", "SOCIAL")] 
public void Test1() 
{ 

} 

Nie jestem pewien, czy próba byłaby podobna do mojej. Ale mam oczekiwany rezultat z poniższym teście

[TestFixture] 
public class TestCaseTest 
{ 
    [TestCase("ACCOUNT","SOCIAL")] 
    public void Get_Test_Result(String a, String b) 
    { 
    Console.WriteLine("{0},{1}",a,b); 
    } 
} 

a wynik

enter image description here

Dodatkowo, jeśli chcesz jakieś odniesienie do TestCaseAttribute

+0

Ogólnie odpowiedzi są o wiele bardziej pomocne, jeśli zawierają wyjaśnienie. –

+1

Nie ma czegoś takiego jak samo-wyjaśniający kod, zwłaszcza gdy mamy do czynienia z takimi dziwactwami składni. * Zwłaszcza * gdy całkowicie odejdziesz od jednego z początkowych założeń i nie wyjaśnisz, dlaczego problem pojawił się w pierwszej kolejności. –

+0

@Sifif Niewłaściwa liczba argumentów pod warunkiem – codebased

2

wierzę, że jest to przypadek Rozdzielczość przeciążenia & zagadnienie co-wariancji tablic.

Z kompilatorem [TestCase(new string[] { "" })] decyduje najlepszy przeciążenie dla konstruktora TestCase jako argumentu przyjmującego params object[]. Dzieje się tak, ponieważ kompilator może przypisać string[] do object[] dzięki współdziałaniu tablic, co powoduje, że jest to bardziej szczegółowe dopasowanie niż przypisanie string[] do object (inny konstruktor).

Nie dzieje się tak z int[], ponieważ co-variance does not apply to arrays of value types, więc kompilator jest zmuszony do korzystania z konstruktora object.

Dlaczego więc decyduje, że new [] { "ACCOUNT", "SOCIAL" } nie jest array creation expression of an attribute parameter type jest poza mną.

+0

Więc możliwe rozwiązanie może być '[TestCase ((obiekt) nowy ciąg [] {"}})] w celu wymuszenia pożądanego przeciążenia ... –

+0

@AlexeiLevenkov: To właśnie bym zrobił. Ale nadal nie mogę dowiedzieć się, dlaczego kompilator ma problemy z ciąg [] jako argument konstruktora atrybutu, mimo że spec mówi, że jest poprawny. –

Powiązane problemy