ruby-on-rails ruby unit-testing mocking stubbing

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



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.