Sto facendo uno sforzo concertato per avvolgere la mia mente attorno a Rspec al fine di passare a un altro schema di sviluppo TDD/BDD. Tuttavia, sono molto lontana e alle prese con alcuni dei fondamenti:Quando e quando non eseguire lo stub/simulazione di un test
Come, quando esattamente dovrei usare mock/stub e quando non dovrei?
Prendiamo ad esempio questo scenario: Ho un modello che Site
has_many :blogs
e il modello has_many :articles
Blog
. Nel mio modello Site
ho un filtro di richiamata che crea un set predefinito di blog e articoli per ogni nuovo sito. Voglio testare il codice, quindi ecco qui:
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
Ora, se corro quel test, tutto passa. Tuttavia, è anche piuttosto lento in quanto sta creando un nuovo sito, due nuovi blog e tre nuovi articoli - per ogni singolo test! Quindi mi chiedo, questo è un buon candidato per l'utilizzo di stub? Diamo un andare:
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
Ora tutti i test ancora passare, e le cose sono un po 'più veloce anche. Ma ho raddoppiato la lunghezza dei miei test e l'intero esercizio mi sembra semplicemente inutile, perché non sto più testando il mio codice, sto solo testando i miei test.
Ora, o ho completamente perso il punto di deride/stub, o mi sto avvicinando che fondamentalmente sbagliato, ma sto sperando che qualcuno potrebbe essere in grado, a:
- Migliorare me test di cui sopra quindi usa stub o mock in un modo che mette alla prova il mio codice, piuttosto che i miei test.
- Oppure, dimmi se dovrei anche usare gli stub qui - o se in realtà questo è completamente inutile e dovrei scrivere questi modelli nel database di test.
Grazie, che è una risposta utile. :) Grazie – aaronrussell