ruby on rails - ¿Debo aplastar el modelo en Factory girl o en el archivo de especificaciones durante la prueba?
ruby-on-rails unit-testing (4)
En las versiones recientes de factory_girl tienes una devolución de llamada after_build, así que creo que podrías definir tu fábrica de esta manera:
FactoryGirl.define do
factory :cimg_for_testing_tags do
... # Factory attributes
after_build do |cimg|
cimg.stub(:validate_img).and_return true
end
end
end
ACTUALIZAR
Después de factory_girl 3.3.0, la sintaxis ha cambiado a lo siguiente:
FactoryGirl.define do
factory :cimg_for_testing_tags do
... # Factory attributes
after(:build) do |cimg|
cimg.stub(:validate_img).and_return true
end
end
end
Casi todos los archivos de especificaciones que encuentro, termino escribiendo cosas como:
before :each do
@cimg = Factory.build :cimg_valid
@cimg.stub(:validate_img).and_return true
@cimg.stub(:validate_img_url).and_return true
@cimg.stub(:save_images).and_return true
@cimg.stub(:process_image).and_return true
@cimg.stub(:img).and_return true
end
Quiero decir, el modelo que obtengo de Factory.build es completamente válido. Pero si no apago eso, guarda cosas en el sistema de archivos y valida cosas que no estoy probando ...
Lo que quiero decir es que creo que sería más limpio hacer algo como esto:
before :each do
@cimg = Factory.build :cimg_for_testing_tags
end
Si es posible pegar dentro de la fábrica.
¿Cuál es la forma correcta de aplastar el modelo?
La respuesta de @fkreusch funciona muy bien hasta que use la nueva sintaxis de RSpec expect()
(3.0+)
Poner esto en rails_helper.rb
funciona para mí:
FactoryGirl::SyntaxRunner.class_eval do
include RSpec::Mocks::ExampleMethods
end
En el ejemplo del OP, ahora puedes hacer:
FactoryGirl.define do
factory :cimg_for_testing_tags do
... # Factory attributes
after(:build) do |cimg|
allow(cimg).to receive(:validate_img) { true }
end
end
end
Crédito: github.com/printercu, consulte: https://github.com/thoughtbot/factory_girl/issues/703#issuecomment-83960003
También podrías considerar usar FactoryGirl#build_stubbed .
Una fábrica debe producir objetos del "mundo real", por lo tanto, es una mala práctica (y propensa a errores) cambiar el comportamiento (es decir, el código auxiliar) en una fábrica.
Tu puedes hacer
let(:user) instance_double(User, FactoryGirl.attributes_for(:user))
before do
allow(user).to receive(:something).and_return(''something'')
end
y si su cláusula before
vuelve demasiado grande, puede extraerla a un método separado o crear una clase de niño simulado que anule los métodos que desea eliminar.