Mam w swoim zestawie testów test, który wygląda mniej więcej tak:
[Fact]
public void VerifySomeStuff()
{
var stuffCollection = GetSomeStuff();
Assert.Equal(1, stuffCollection.Count());
}
Ten test działa zgodnie z oczekiwaniami, ale kiedy go uruchamiam, xUnit wyświetla ostrzeżenie:
ostrzeżenie xUnit2013: Nie używaj funkcji Assert.Equal () do sprawdzania rozmiaru kolekcji.
Jednak ostrzeżenie nie sugeruje żadnej alternatywy, a wyszukiwarka Google przenosi mnie do kodu źródłowego w xUnit w celu wydrukowania testu, który weryfikuje to ostrzeżenie.
Jeśli Assert.Equal()
nie jest to właściwy sposób sprawdzenia długości kolekcji, to co to jest?
Dla wyjaśnienia: zdaję sobie sprawę, że mógłbym „oszukać” xUnit, aby nie emitował tego ostrzeżenia, np. Wyodrębniając zmienną lub używając Assert.True(stuff.Count() == 1)
zamiast tego. To drugie jest po prostu hacky, a pierwsze wydaje się, że jeśli xUnit próbuje np. Uniknąć wielu iteracji an IEnumerable<T>
, to jest to niewłaściwa droga (ponieważ otrzymam wskazówki kompilatora na ten temat osobno, jeśli jest to problem), i xUnit Sama nigdy nie powinna musieć oceniać danych wejściowych więcej niż raz (w rzeczywistości prawdopodobnie otrzyma te same dane wejściowe niezależnie od wyodrębniania zmiennych, ze względu na to, jak działa wywołanie funkcji C #).
Nie jestem więc zainteresowany tylko usunięciem tego ostrzeżenia z moich wyników. Odpowiedź na moje pytanie wyjaśnia również, dlaczego to ostrzeżenie jest zawarte w bibliotece w pierwszej kolejności i dlaczego jakiekolwiek podejście, które powinienem zastosować, jest lepsze.
stuffCollection.Count()
w osobnej zmiennej i przekazujesz ją do potwierdzenia, czy daje to ten sam błąd?Odpowiedzi:
Xunit oferuje szybkie poprawki dla większości swoich ostrzeżeń, więc powinieneś być w stanie zobaczyć, co uważa za „właściwe”.
W twoim przypadku chce, abyś użył,
Assert.Single
ponieważ oczekujesz dokładnie jednego przedmiotu. Gdybyś podawał dowolną liczbę, na przykład 412, nie dałoby to ostrzeżenia o użyciuCount
. Zasugeruje użycie tylkoSingle
wtedy, gdy spodziewasz się jednego przedmiotu lubEmpty
jeśli nie spodziewasz się żadnych przedmiotów.źródło
Empty
,Single
iNotEmpty
- jeśli spodziewasz się wartości dynamicznej, xUnit2013 nie powinno wyzwalać.Znalazłem to, daj mi ten sam błąd:
Przesyłanie go powstrzymało pojawienie się błędu.
źródło
W przypadku pojedynczego elementu na liście najlepiej jest użyć tego:
Assert.Single(resultList);
źródło
Miałem ten sam problem, gdy użyłem właściwości Count, jak poniżej w xUnit.
Później używam funkcji Count () w kolekcji, rozwiązało to mój problem.
źródło