2010-02-18 5 views
6

Sto utilizzando l'attributo NUnit 2.5.3 TestCaseSource e la creazione di una factory per generare i miei test. Qualcosa di simile a questo:NUnit TestCaseSource passa il valore alla fabbrica

[Test, TestCaseSource(typeof(TestCaseFactories), "VariableString")] 
public void Does_Pass_Standard_Description_Tests(string text) 
{ 
    Item obj = new Item(); 
    obj.Description = text; 
} 

La mia fonte è questa:

public static IEnumerable<TestCaseData> VariableString 
{ 
    get 
    { 
     yield return new TestCaseData(string.Empty).Throws(typeof(PreconditionException)) 
      .SetName("Does_Reject_Empty_Text"); 
     yield return new TestCaseData(null).Throws(typeof(PreconditionException)) 
      .SetName("Does_Reject_Null_Text"); 
     yield return new TestCaseData(" ").Throws(typeof(PreconditionException)) 
      .SetName("Does_Reject_Whitespace_Text"); 
    } 
} 

Che cosa ho bisogno di essere in grado di fare è quello di aggiungere un controllo di lunghezza massima di La variabile stringa, ma questa lunghezza massima è definito in i contratti nella classe in esame. Nel nostro caso è una semplice struttura pubblica:

public struct ItemLengths 
    { 
     public const int Description = 255; 
    } 

Non riesco a trovare alcun modo di passare un valore al generatore del caso di test. Ho provato valori condivisi statici e questi non vengono raccolti. Non voglio salvare materiale su un file, in quanto poi avrei bisogno di rigenerare questo file ogni volta che il codice cambia.

voglio aggiungere la seguente riga alla mia TestCase:

yield return new TestCaseData(new string('A', MAX_LENGTH_HERE + 1)) 
    .Throws(typeof(PreconditionException)); 

qualcosa di abbastanza semplice nel concetto, ma qualcosa mi sto trovando impossibile da fare. Eventuali suggerimenti?

risposta

2

Modificare il parametro del test come classe anziché una stringa. Così:

public class StringTest { public string testString; public int maxLength; }

Quindi creare questa classe per passare come argomento al costruttore TestCaseData. In questo modo puoi passare la stringa e qualsiasi altro argomento che ti piace.

Un'altra opzione consiste nel rendere il test composto da 2 argomenti di stringa e int.

Quindi per TestCaseData ("mystring", 255). Ti sei reso conto che possono avere più argomenti?

Wayne

1

ho affrontato un problema simile come la tua e ha finito per scrivere una piccola addin NUnit e un attributo personalizzato che estende il NUnit TestCaseSourceAttribute. Nel mio caso particolare non ero interessato a passare parametri al metodo factory ma potevi facilmente usare la stessa tecnica per ottenere quello che volevi.

Non è stato poi così difficile e mi ha richiesto solo di scrivere qualcosa come tre piccole classi. Puoi leggere di più sulla mia soluzione a: blackbox testing with nunit using a custom testcasesource.

PS. Per usare questa tecnica devi usare NUnit 2.5 (almeno) Buona fortuna.