Czy można dodawać odroczone twierdzenia w ten sposób?
var actualKittens = actualKittens.Select(kitten => {
Assert.IsСute(kitten);
return kitten
});
Dlaczego? Mogę więc powtórzyć tylko raz, nawet w przypadku stwierdzeń oczekujących zmaterializowanej kolekcji, na przykład:
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());
Może to być nie tylko Select, ale metoda ze zdefiniowanym iteratorem i mająca wiele kontroli i logiki (np. Zliczanie i filtrowanie).
Nasieniem wątpliwości jest złożoność odczytu i debugowania takiego kodu w przypadku niepowodzenia testu.
sequence.WithSideEffect(item => Assert.IsCute(item))
aby uczynić go czystszym.expectedKittens
? Właśnie ukryłeś iteracje wywołań metod..All()
.Odpowiedzi:
Nie , nie jest. Dlaczego? Ponieważ jeśli z jakiegokolwiek powodu usuniesz drugie stwierdzenie, test nadal zmieni kolor na zielony i uważasz, że nadal działa, ale nie działa, ponieważ kolekcja nie zostanie wyliczona. Jeśli masz dwa lub więcej niezależnych stwierdzeń, będą wykonywać swoją pracę nawet po wyłączeniu jednego z nich.
Rozważ tę kombinację:
Teraz nawet jeśli wyłączysz lub usuniesz jeden z twierdzeń, drugi nadal wykona swoją pracę. Również jeśli zapomnisz zmaterializować kolekcję, jej uruchomienie może potrwać dłużej, ale nadal będzie działać. Niezależne testy są bardziej niezawodne i niezawodne.
Jest też drugie nie . Nie jestem pewien, jak radzą sobie z tym inne frameworki, ale jeśli używasz platformy MS Test, nie wiedziałbyś, który test się nie powiódł. Jeśli klikniesz dwukrotnie test zakończony niepowodzeniem, wyświetli się komunikat „zakończony
CollectionAssert
niepowodzeniem”, ale w rzeczywistości zagnieżdżenie się nie powiodłoAssert
i bardzo trudno będzie go debugować. Oto przykład:Oznacza to, że pierwszy test jest faktycznie bezużyteczny, ponieważ nie pomaga znaleźć błędu. Nie wiesz, czy nie powiódł się, ponieważ numer był nieprawidłowy lub ponieważ obie kolekcje były różne.
Zastanawiam się, dlaczego ci na tym zależy? To są testy jednostkowe. Nie musisz optymalizować każdego z nich i zwykle testy nie wymagają milionów elementów, więc wydajność nie powinna być problemem.
Musisz utrzymywać takie testy, więc dlaczego miałbyś je bardziej skomplikować niż to konieczne? Napisz proste stwierdzenia, które działają.
źródło
ToList
spowoduje iterację tego, co wyliczalne, prawda?Assert.Fail
ale naCollectionAssert
i nie będziesz w stanie powiedzieć, które twierdzenie faktycznie poszło nie tak. Mam na myśli, że VS nie skupi sięAssert.Fail
na innym, ale na drugim ... teraz możesz debugować.