Krótka odpowiedź brzmi „nie”. Bardziej interesujące jest to, dlaczego / jak taka sytuacja może się pojawić.
Myślę, że powstaje zamieszanie, ponieważ próbujesz przestrzegać ścisłych praktyk testowych (testy jednostkowe vs. testy integracyjne, kpiny itp.) W poszukiwaniu kodu, który nie wydaje się przestrzegać ścisłych praktyk.
Nie oznacza to, że kod jest „zły” lub że określone praktyki są lepsze niż inne. Po prostu, niektóre założenia przyjęte przez praktyki testowania mogą nie mieć zastosowania w tej sytuacji, i może pomóc zastosować podobny poziom „rygorystyczności” w praktykach kodowania i praktykach testowania; lub przynajmniej, aby uznać, że mogą być niezrównoważone, co spowoduje, że niektóre aspekty nie będą miały zastosowania lub będą zbędne.
Najbardziej oczywistym powodem jest to, że twoja funkcja wykonuje dwa różne zadania:
- Wyszukiwanie
Person
według ich nazwy. Wymaga to testów integracyjnych, aby upewnić się, że może znaleźć Person
obiekty, które są prawdopodobnie tworzone / przechowywane gdzie indziej.
- Obliczanie, czy a
Person
jest wystarczająco stary, na podstawie ich płci. Wymaga to testów jednostkowych, aby upewnić się, że obliczenia przebiegają zgodnie z oczekiwaniami.
Dzięki pogrupowaniu tych zadań w jeden blok kodu nie można uruchomić jednego bez drugiego. Gdy chcesz przetestować obliczenia za pomocą jednostki, musisz sprawdzić Person
(z prawdziwej bazy danych lub z kodu pośredniczącego / próbnego). Jeśli chcesz przetestować, czy wyszukiwanie integruje się z resztą systemu, musisz również wykonać obliczenia dotyczące wieku. Co powinniśmy zrobić z tymi obliczeniami? Czy powinniśmy to zignorować, czy sprawdzić? Wydaje się, że jest to dokładne położenie, które opisujesz w swoim pytaniu.
Jeśli wyobrażamy sobie alternatywę, możemy mieć obliczenia na własną rękę:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
Ponieważ jest to czysta kalkulacja, nie musimy przeprowadzać na niej testów integracyjnych.
Możemy też pokusić się o osobne napisanie zadania wyszukiwania:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
Jednak w tym przypadku funkcjonalność jest tak bliska Person::API.new
, że powinieneś użyć jej zamiast tego (jeśli domyślna nazwa jest konieczna, czy lepiej byłoby ją przechowywać gdzie indziej, na przykład atrybut klasy?).
Pisząc testy integracyjne dla Person::API.new
(lub person_from_name
) wszystko, o co musisz się martwić, to to, czy odzyskasz oczekiwane Person
; wszystkie obliczenia oparte na wieku są przeprowadzane gdzie indziej, więc testy integracyjne mogą je zignorować.