2015-04-02 11 views
8

Desidero passare diversi parametri di test utilizzando NUnit Test.Impossibile passare allo string array

Posso passare array integer, nessun problema, ma quando passo array di stringhe non funziona.

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

errore 3 Un argomento attributo deve essere un'espressione costante, typeof espressione o creazione matrice espressione di un parametro di attributo tipo ... \ ContactControllerTests.cs 78 13 Unittests

Si funziona quando uso array di stringhe come secondo argomento.

Quindi qual è la ragione?

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

Hai provato a specificare il tipo di matrice in modo esplicito? 'nuova stringa [] {...}'? – abatishchev

+0

@abatishchev Sì, ma non funziona. – codebased

+1

Vedo. Bummer. Quale versione di NUnit usi? – abatishchev

risposta

0

considerazione facendo come segue

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

} 

Non sono sicuro se il test sarebbe simile alla mia. Ma ho ottenuto il risultato atteso con la seguente prova

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

E il risultato

enter image description here

Inoltre, se volete qualche riferimento al TestCaseAttribute

+0

In genere, le risposte sono molto più utili se includono una spiegazione. –

+1

Non esiste un codice autoesplicativo, specialmente quando si ha a che fare con eccitazioni di sintassi come questa. * Specialmente * quando parti completamente da una delle ipotesi iniziali e non spieghi perché il problema si è verificato in primo luogo. –

+0

@Saifur Numero errato di argomenti forniti – codebased

2

Credo che questo sia un caso di Risoluzione di sovraccarico & problema di co-varianza degli array.

Con [TestCase(new string[] { "" })] il compilatore decide che il sovraccarico migliore per il costruttore TestCase è quello che richiede params object[] come argomento. Questo perché il compilatore può assegnare string[] a object[] grazie agli array in co-varianza e di conseguenza questa corrispondenza è più specifica rispetto a string[] a object assegnazione (altro costruttore).

Questo non accade con int[] perché co-variance does not apply to arrays of value types in modo che il compilatore è costretto a utilizzare il costruttore object.

Ora, perché decide che new [] { "ACCOUNT", "SOCIAL" } non è un array creation expression of an attribute parameter type è oltre me.

+0

Quindi la soluzione possibile potrebbe essere '[TestCase ((object) new string [] {" "})]' per forzare il sovraccarico desiderato ... –

+0

@AlexeiLevenkov: questo è quello che farei. Ma non riesco ancora a capire perché il compilatore abbia problemi con string [] come argomento del costruttore di attributi anche se la specifica dice che è valida. –