Я прилагаю согласованные усилия, чтобы с головой окунуться в Rspec, чтобы двигаться в сторону большей части шаблона разработки TDD / BDD. Тем не менее, я очень далеко и борюсь с некоторыми основными принципами:
Например, когда именно мне следует использовать mocks / stubs, а когда нет?
Возьмем, к примеру, следующий сценарий: у меня есть Сайт
моделирует has_many: blogs
и модель блога
has_many: статьи
. В моей модели сайта
у меня есть фильтр обратного вызова, который создает набор блогов и статей по умолчанию для каждого нового сайта. Я хочу протестировать этот код, поэтому здесь:
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
Теперь, если я запустил этот тест, все прошло успешно. Однако он также довольно медленный, так как создает новый сайт, два новых блога и три новые статьи - для каждого теста! Так что мне интересно, это хороший кандидат для использования заглушек? Давайте попробуем:
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
Теперь все тесты проходят, и все идет немного быстрее. Но я удвоил длину своих тестов, и все это упражнение кажется мне совершенно бессмысленным, потому что я больше не тестирую свой код, я просто тестирую свои тесты.
Теперь либо я полностью упустил момент насмешек / заглушек, или я подхожу к этому в корне неверно, но я надеюсь, что кто-то сможет либо: