2010-09-28 7 views
6

mi sto trovando me stesso che necessitano di un sacco di questo tipo di logica ultimamente:Esiste un vincolo Has-Only-one in NUnit?

Assert.That(collection.Items, Has.Member(expected_item)); 
Assert.That(collection.Items.Count(), Is.EqualTo(1)); 

vedo che NUnit offre Has.Some e Has.All, ma non vedo nulla di simile Has.One. Qual è il modo migliore per farlo senza due asserzioni?

risposta

3

Come di NUnit 2.6 (non in giro quando questa domanda è stato chiesto):

Assert.That(collection.Items, Has.Exactly(1).EqualTo(expected_item)); 

Has.Exactly "Si applica un vincolo per ogni elemento in un insieme , con successo se il numero specificato di elementi ha esito positivo. " [1]

10

si potrebbe provare qualcosa di simile:

Assert.AreEqual(collection.Items.Single(), expected_item); 

singolo restituirà l'unico elemento della collezione, o un'eccezione se esso non contiene esattamente 1 articolo.

Io non sono che la familiarità con NUnit, però, così qualcuno potrebbe offrire una soluzione migliore che fa uso di una funzione di NUnit ...

EDIT: dopo una rapida ricerca, l'unica funzione di NUnit che sembra si avvicinano è Is.EquivalentTo(IEnumerable):

Assert.That(collection.Items, Is.EquivalentTo(new List<object>() {expected_item})); 

IMO la prima opzione si legge meglio per me, ma il secondo potrebbe dare una migliore messaggio di eccezione a seconda delle vostre preferenze.

+0

Buona risposta. Mi chiedo ancora se non ci sia un limite nascosto lì da qualche parte che fa quello che voglio, anche se ... sembra abbastanza naturale, no? – ladenedge

+0

Beh, non proprio naturale, in quanto un elenco contiene naturalmente qualsiasi quantità di elementi, e se te ne aspetti solo uno, sconfigge lo scopo di un elenco :) – PostMan

+0

@PostMan - È perfettamente naturale e molto comune aspettarsi esattamente un elemento in un elenco (o, in generale, un oggetto IEnumerable) per uno scenario di prova specifico. –

3

Come su

Assert.IsTrue(collection.Items.Count() == 1 && collection.Items.Contains(expected_item)); 

perché non è sufficiente per voi?

+1

A causa del messaggio di errore scarso quando il test ha esito negativo. Se il conteggio era diverso da 1 _o_ l'oggetto non è stato trovato nella raccolta, il messaggio di errore sarebbe semplicemente "Previsto: vero, ma era: falso" - inutile per vedere rapidamente cosa è andato storto. –

0

Se Articoli proprietà ha un indicizzatore si potrebbe usare


Assert.AreEqual(collection.Items[0], expected); 

+2

Non conferma che esista esattamente un articolo – PostMan

+0

Sei corretto. Ho perso questo. –

Problemi correlati