Próbuję robić projekt zgodnie z TDD i mam mały problem.
Mam model Board, który będzie miał strukturę hierarchiczną (do tego będę używał gemu has_ancestry).
Zgodnie z techniką TDD, najpierw powinienem napisać test dla tego modelu. Ja zrobiłem coś takiego(wiem, że ten gem dodaje m.in. taką metodę do modelu)
it "responses to #children" do
expect(board).to respond_to :children
end
Po tym dodałem gem, zainstalowałem, dodałem w modelu ‘has_ancestry’ i wszystko jest ok.
Tylko z tego co wiem, w TDD powinniśmy napisać jak najprostszy kod, który będzie zadowalał taki test.
Taki kod to by było pewnie:
def children
end
Więc wygląda na to, że jakoś źle się do tego zabrałem, albo powinienem jakiś nowy test dodać, a może jest coś takiego jak expect(board).to has_ancestry ??
Będę wdzięczny za podpowiedź jak do takich rzeczy się zabrać.
Używanie respond_to w sumie niewiele ci powie, czy funkcjonalność działa.
Jeżeli dziećmi/rodzicami są instancje tej samej klasy możesz zrobić coś takiego
child = Board.create
board.children << child (albo jakiś inny sposób dołaczania do dzieci)
board.children.all.should include(child)
No i generalnie dobrą praktyką jest nie testować dowolnych metod gema, a tylko te publiczne metody których będziesz używał w aplikacji. Dzięki temu testy nie sprawdzają, czy użyłeś tego konkretnego gema (który możesz zmienić, albo napisać własną implementację), a czy twoje api robi to, co zaplanowałeś.
[quote=kham] board.stub(:children).and_return(double('children'))
Hę? Przecież teraz test przejdzie nawet jakby Board nie miał tej metody.[/quote]
Czyli lepiej stworzyć metodę w modelu, która ma służyć tylko i wyłącznie do testowania, bo zaraz zostanie zastąpiona przez has_ancestry?
Ogólnie to trochę przesada z TDD według mnie. Dla świętego spokoju do modelu dołączyłbym tę metodę “has_ancestry” i nie bawił się w imitację funkcjonalności biblioteki.
I tak zrobiłem, wywaliłem ten test, bo tak na prawdę to nic nie mówi. Dodałem ‘has_ancestry’ i testował będę dopiero metody, funkcjonalności które ten gem wykorzystują.