Mam kilka klas, które zajmują się walidacją wartości. Na przykład RangeValidatorklasa sprawdza, czy wartość mieści się w określonym zakresie.
Każda klasa walidatora zawiera dwie metody: is_valid(value)która zwraca wartość Truelub Falsezależy od niej i ensure_valid(value)która sprawdza określoną wartość i albo nie robi nic, jeśli wartość jest poprawna, albo zgłasza określony wyjątek, jeśli wartość nie pasuje do wstępnie zdefiniowanych reguł.
Obecnie z tą metodą związane są dwa testy jednostkowe:
Ten, który przekazuje niepoprawną wartość i zapewnia, że wyjątek został zgłoszony.
def test_outside_range(self): with self.assertRaises(demo.ValidationException): demo.RangeValidator(0, 100).ensure_valid(-5)Ten, który przekazuje prawidłową wartość.
def test_in_range(self): demo.RangeValidator(0, 100).ensure_valid(25)
Chociaż drugi test wykonuje swoją pracę - nie powiedzie się, jeśli zostanie zgłoszony wyjątek, a powiedzie się, jeśli ensure_validniczego nie wyrzuci - fakt, że w środku nie ma żadnych assertznaków, wygląda dziwnie. Ktoś, kto czyta taki kod, od razu zadaje sobie pytanie, dlaczego istnieje test, który wydaje się nic nie robić.
Czy jest to obecna praktyka podczas testowania metod, które nie zwracają wartości i nie wywołują skutków ubocznych? Czy powinienem przepisać test w inny sposób? Lub po prostu wstaw komentarz wyjaśniający, co robię?
selfreferencji) i nie zwraca żadnego wyniku, nie jest to funkcja czysta.
voidw wielu językach i ma głupie reguły). Alternatywnie, możesz mieć nieskończoną pętla (która działa nawet wtedy, gdy „nie zwraca wyniku” naprawdę oznacza, że nie zwraca wyników.
unit -> unitw dowolnym języku, która uważa jednostkę za standardowy typ danych zamiast czegoś magicznie specjalnego. Niestety po prostu zwraca jednostkę i nic więcej nie robi.