Когда и когда не заглушать / имитировать тест

Я прилагаю согласованные усилия, чтобы с головой окунуться в 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

Теперь все тесты проходят, и все идет немного быстрее. Но я удвоил длину своих тестов, и все это упражнение кажется мне совершенно бессмысленным, потому что я больше не тестирую свой код, я просто тестирую свои тесты.

Теперь либо я полностью упустил момент насмешек / заглушек, или я подхожу к этому в корне неверно, но я надеюсь, что кто-то сможет либо:

  • Улучшить мои тесты, приведенные выше, чтобы он использовал заглушки или заглушки таким образом, чтобы фактически проверять мой код , а не мои тесты.
  • Или скажите мне, следует ли мне вообще использовать здесь заглушки - или на самом деле это совершенно не нужно, и я должен записывать эти модели в тестовую базу данных.
8
задан aaronrussell 14 September 2010 в 00:04
поделиться