Podejmuję wspólny wysiłek, aby owinąć głowę wokół Rspec, aby przejść do bardziej rozwiniętego wzoru rozwoju TDD/BDD. Jestem jednak daleko i walczę z niektórymi podstawami:Kiedy i kiedy nie ma być kikutem/kpiną z testu
Kiedy dokładnie powinienem używać makiet/kikutów, a kiedy nie powinienem?
Weźmy na przykład taki scenariusz: Mam Site
model, który has_many :blogs
i Blog
modelu has_many :articles
. W moim modelu Site
mam filtr zwrotny, który tworzy domyślny zestaw blogów i artykułów dla każdej nowej witryny. Chcę przetestować ten kod, tak tu idzie:
describe Site, "when created" do
include SiteSpecHelper
before(:each) do
@site = Site.create valid_site_attributes
end
it "should have 2 blogs" do
@site.should have(2).blogs
end
it "should have 1 main blog article" do
@site.blogs.find_by_slug("main").should have(1).articles
end
it "should have 2 secondary blog articles" do
@site.blogs.find_by_slug("secondary").should have(2).articles
end
end
Teraz, jeśli mogę uruchomić ten test, wszystko przemija. Jest jednak również dość powolny, ponieważ tworzy nową witrynę, dwa nowe blogi i trzy nowe artykuły - na każdy pojedynczy test! Zastanawiam się, czy jest to dobry kandydat do używania kodów pośredniczących? Spróbujmy:
describe Site, "when created" do
include SiteSpecHelper
before(:each) do
site = Site.new
@blog = Blog.new
@article = Article.new
Site.stub!(:create).and_return(site)
Blog.stub!(:create).and_return(@blog)
Article.stub!(:create).and_return(@article)
@site = Site.create valid_site_attributes
end
it "should have 2 blogs" do
@site.stub!(:blogs).and_return([@blog, @blog])
@site.should have(2).blogs
end
it "should have 1 main blog article" do
@blog.stub!(:articles).and_return([@article])
@site.stub_chain(:blogs, :find_by_slug).with("main").and_return(@blog)
@site.blogs.find_by_slug("main").should have(1).articles
end
it "should have 2 secondary blog articles" do
@blog.stub!(:articles).and_return([@article, @article])
@site.stub_chain(:blogs, :find_by_slug).with("secondary").and_return(@blog)
@site.blogs.find_by_slug("secondary").should have(2).articles
end
end
Teraz wszystkie testy wciąż mijają, a sprawy są nieco szybsze. Ale podwoiłem długość moich testów i całe ćwiczenie wydaje mi się kompletnie bezsensowne, ponieważ nie testuję już swojego kodu, testuję tylko moje testy.
Teraz albo ja całkowicie brakowało punktu drwi/odcinki, albo ja zbliża to fundamentalnie złe, ale mam nadzieję, ktoś może być w stanie albo:
- Pomóż mi testuje powyżej więc używa skrótów lub makiet w sposób, który faktycznie testuje mój kod, a nie moje testy.
- Albo, powiedz mi, czy powinienem nawet używać tutaj kodów pośrednich - lub czy w rzeczywistości jest to całkowicie niepotrzebne i powinienem pisać te modele do testowej bazy danych.
Dziękuję, to jest pomocna odpowiedź :) :) – aaronrussell