2010-09-28 12 views
6

jestem znalezieniem się wymagające dużo tego rodzaju logiki ostatnio:Czy w NUnit obowiązuje ograniczenie "tylko jeden-do-jednego"?

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

widzę, że NUnit oferuje Has.Some i Has.All, ale nie widzę niczego podobnego Has.One. Jaki jest najlepszy sposób na osiągnięcie tego bez dwóch twierdzeń?

Odpowiedz

3

Od NUnit 2.6 (nie wokół gdy pytano):

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

Has.Exactly „Dotyczy ograniczenie do każdego elementu w kolekcji , powodzenie, jeśli określona liczba elementów zakończy się pomyślnie. " [1]

10

można spróbować coś takiego:

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

pojedyncze powróci tylko pozycja w kolekcji, czy wyjątek, jeśli nie zawierają dokładnie 1 element.

nie jestem zaznajomiony z NUnit chociaż, więc ktoś może zaoferować lepsze rozwiązanie, które robi użyć funkcji NUnit ...

EDIT: po szybkim wyszukiwaniu, jedyną funkcją NUnit, który wydaje się zbliżyć jest Is.EquivalentTo(IEnumerable):

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

IMO pierwsza opcja brzmi lepiej do mnie, ale ta ostatnia może dać lepsze komunikat wyjątku w zależności od preferencji.

+0

Dobra odpowiedź. Nadal zastanawiam się, czy nie ma tam ukrywania przymusu, który robi to, co chcę, chociaż ... wydaje się to dość naturalne, nie? – ladenedge

+0

Cóż za niezupełnie naturalne, ponieważ lista zawiera naturalnie dowolną ilość przedmiotów, a jeśli spodziewacie się tylko jednego, to pokonuje cel listy :) – PostMan

+0

@PostMan - To zupełnie naturalne i bardzo często spodziewać się dokładnie jednego przedmiotu na liście (lub generalnie IEnumerable) dla specyficznego scenariusza testowego. –

3

Jak o

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

dlaczego nie jest wystarczające dla Ciebie?

+1

Z powodu słabego komunikatu o błędzie, gdy test się nie powiedzie. Jeśli licznik był inny niż 1 _lub_ element nie został znaleziony w kolekcji, komunikat o błędzie byłby po prostu "Oczekiwany: prawda, ale był: fałszywy" - bezużyteczny dla szybkiego sprawdzenia, co poszło nie tak. –

0

Jeżeli nieruchomość Pozycje ma podziałowe można użyć


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

+2

Nie potwierdza, że ​​istnieje dokładnie jedna pozycja – PostMan

+0

Masz rację. Tęsknie za tym. –

Powiązane problemy