2009-02-13 18 views
18

Poiché il test delle unità non è utilizzato nella nostra azienda, mi sto insegnando a testare il mio codice. Sto usando il framework di test standard .net per alcuni test di unità veramente di base.Assert IEnumerables

Un metodo restituisce un IEnumerable<string> e voglio testarlo. Così ho creato un IEnumerable<string> previsto per testarlo contro. Pensavo di essermi ricordato che esisteva un modo per Assert.ArePartsEqual o qualcosa del genere, ma non riesco a trovarlo.

Quindi, in breve, come si verifica se due IEnumerable<string> contengono le stesse stringhe?

+1

+1 per la buona attitudine e professionalità :) –

+0

He: P Questo è uno dei migliori complimenti che un programmatore junior può ottenere;) –

risposta

23

Non so quale "standard .net framework di test" a cui ti stai riferendo, ma se si tratta di materiale di test dell'unità di Visual Studio Team, è possibile utilizzare CollectionAssert.

Il test sarebbe stato così:

CollectionAssert.AreEqual(ExpectedList, ActualList, "..."); 

Aggiornamento: Ho dimenticato CollectionAssert necessita di un'interfaccia ICollection, quindi dovrete chiamare ActualList.ToList() per farlo compilare. Restituire l'IEnumerable è una buona cosa, quindi non cambiarlo solo per i test.

+0

Che accetta un ICollection, non un IEnumerable ... quindi dovresti inserirlo anche in una raccolta ... –

+0

@Marc Gravell, hai ragione .. Lo aggiungerò alla "risposta" –

11

si desidera che il metodo di SequenceEqual() estensione (LINQ):

string[] x = { "abc", "def", "ghi" }; 
    List<string> y = new List<string>() { "abc", "def", "ghi" }; 

    bool isTrue = x.SequenceEqual(y); 

o semplicemente:

bool isTrue = x.SequenceEqual(new[] {"abc","def","ghi"}); 

(tornerà falso se hanno lunghezze diverse, o qualsiasi elemento è diverso)

+0

Quindi, per tradurlo in qualcosa per il test dell'unità, potrei andare su Assert.IsTrue (risultato. SequenceEqual (expected)); Questo non fornisce un messaggio utile, ma mi porta lì così va bene. –

+0

@boris: Sarebbe davvero facile tradurre il mio codice (attualmente basato su NUnit) nella versione MS. Poi ricevi un bel messaggio. –

+0

Sì, ho dato un'occhiata a questo. Al momento sono un po 'bloccato nei tempi per sperimentare con i test unitari, dato che lo sto facendo come non richiesto (vedi OP). Ma proverò a spremere un po 'di quello. –

5

Ho un esempio di ciò che ho usato per il mio talk "Implementare LINQ agli oggetti in 60 minuti".

Anche nel mio progetto MoreLinq. Avendo provato a non farlo qui, si avvolge orribilmente. Solo grab from Github ...

+0

Link codice Google non funzionante, eccone uno che funziona: https://code.google.com/p/morelinq/source/browse/MoreLinq.Test/TestExtensions.cs – vvnurmi

+0

@vvnurmi: Ah, le gioie della conversione da svn a hg :) Modifica il link. –

+0

Spostato su github: https://github.com/morelinq/MoreLINQ/blob/master/MoreLinq.Test/TestExtensions.cs – MKesper