2011-01-27 3 views
19

Vorrei scrivere una funzione chiamabile che accetta due oggetti e confronta più di 30+ proprietà di tali oggetti con asserzioni. Il problema è che questo deve essere fatto per circa 20 test unitari esistenti e la maggior parte dei test futuri, e la scrittura dei 30+ asseriti ogni volta richiede tempo e spazio.È possibile parametrizzare un test di nunit

Attualmente ho una funzione di test non di unità che confronta gli oggetti e restituisce una stringa con "pass" o un messaggio di errore e utilizza un assert per convalidarlo in ciascun test di unità. Tuttavia, è abbastanza disordinato e mi sento come se andassi contro i corretti metodi di test delle unità.

Esiste un modo per rendere possibile una funzione richiamabile dall'interno dei test di unità che utilizza asserzioni per verificare le condizioni?

risposta

17

Per rispondere alla parte finale, si può ovviamente avere Asserisce all'interno di un'altra funzione. Afferma lavoro sollevando eccezioni che le catture di prova corridore, e interpreta come un fallimento, in modo da avere un test in questo modo funzionerà benissimo:

public void CheckAsserts(string value) 
{ 
    Assert.IsNotNull(value); 
} 

[TestCase("yes!")] 
public void MyTest(string value) 
{ 
    CheckAsserts(value); 
} 
+0

Questo è esattamente quello che stavo cercando di fare, ma con due parametri. Ho avuto la funzione di un caso di prova che penso fosse il mio problema. Grazie – NewNetProgrammer

4

Sì, i test di unità sono come qualsiasi altro codice.

In particolare, controllare NUnit.TestCaseAttribute.

+0

L'avevo esaminato, ma non riuscivo a vedere come impostare i parametri dinamici. Volevo confrontare 20+ oggetti popolati manualmente con oggetti popolati automaticamente dal database. Creare una funzione void con asserzioni (non un caso di test) e chiamare quella dai miei test unitari ha funzionato perfettamente. Grazie – NewNetProgrammer

32

Se si utilizza NUnit 2.5.5 o versione successiva, è possibile utilizzare l'attributo TestCase.

test di unità normale sarebbe decorate con [Test], ma siamo in grado di sostituire che come segue:

[TestCase("0", 1)] 
[TestCase("1", 1)] 
[TestCase("2", 1)] 
public void UnitTestName(string input, int expected) 
{ 
    //Arrange 

    //Act 

    //Assert 
} 

quel tipo di cosa sarà il modo per farlo - ovviamente prendere diverse params.

Guardate questo aiuto: http://nunit.org/?p=testCase&r=2.5

+0

Il problema è che i miei casi di test non sono statici. Ho un oggetto popolato manualmente e uno popolato dal database che voglio confrontare. – NewNetProgrammer

+0

'expected' dovrebbe essere il tipo di ritorno del test parametrizzato, e si dovrebbero fornire casi di test con valori di ritorno anziché parametri. –

0

Avrete bisogno l'attributo TestCase:

[TestCase("string1",...) 
public void test_UnitTest(string Parameter) 
{ 
    ... 
    Assert.AreEqual(Parameter, result) 
} 

Si noti che questo funziona solo con tipi di dati primitivi, come le stringhe e interi - non è possibile creare un'istanza tua propria classe e usarla come parametro.

+0

Il problema è che sto usando il mio oggetto di classe con 30+ attributi che voglio confrontare. – NewNetProgrammer

1

È possibile utilizzare l'attributo TestCase:

[TestCase("hostname1parameter")] 
[TestCase("hostname2parameter")] 
public void Example_TestHostName(string hostname) 
{ 
    ... 
} 
0

Si può anche trarre vantaggio dall'utilizzo di C# introspezione. Questo ti permette di ottenere i nomi dei campi senza specificarli nel codice. Puoi quindi chiamarli per nome.

System.Attribute [] attrs = System.Attribute.GetCustomAttributes (t);

Ciò consente di scrivere determinati tipi di test applicabili a classi che non sono state ancora scritte.