Estoy haciendo un esfuerzo conjunto para rodear Rspec con el fin de avanzar hacia un patrón de desarrollo TDD/BDD. Sin embargo, estoy muy lejos y estoy luchando con algunos de los fundamentos:Cuándo y cuándo no resbalar/simular una prueba
Me gusta, ¿cuándo exactamente debería estar usando mocks/stubs y cuándo no?
Tomemos por ejemplo este escenario: Tengo un modelo Site
que has_many :blogs
y el modelo has_many :articles
Blog
. En mi modelo Site
tengo un filtro de devolución de llamada que crea un conjunto predeterminado de blogs y artículos para cada sitio nuevo. Quiero probar que el código, así que aquí va:
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
Ahora, si me quedo esa prueba, todo pasa. Sin embargo, también es bastante lento ya que está creando un nuevo sitio, dos nuevos blogs y tres nuevos artículos, ¡para cada prueba individual! Entonces me pregunto, ¿es este un buen candidato para usar talones? Vamos a darle una oportunidad:
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
Ahora todas las pruebas aún pasan, y las cosas son un poco más rápidas también. Pero he duplicado la duración de mis pruebas y todo el ejercicio me parece completamente absurdo, porque ya no estoy probando mi código, solo estoy probando mis pruebas.
Ahora, o me he perdido por completo el punto de burla de los talones/o estoy acercarse a ella fundamentalmente equivocado, pero estoy esperando que alguien podría ser capaz de, ya sea:
- Mejorar Me pruebas anteriores entonces usa stubs o burlas de una forma que realmente prueba mi código, en lugar de mis pruebas.
- O, dígame si incluso debería usar stubs aquí - o si de hecho esto es completamente innecesario y debería escribir estos modelos en la base de datos de prueba.
Gracias, esa es una respuesta útil. :) – aaronrussell