Almost every spec file I come accross I end up writing stuff like:
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
I mean, the model I get from Factory.build is completely valid. But if I don't stub that stuff it saves things in the filesystem, and validates stuff I'm not testing...
What I mean, I think it would be cleaner to do something like this:
before :each do
@cimg = Factory.build :cimg_for_testing_tags
end
If stubbing within the Factory is even possible.
What is the proper way to stub the model?
In recent versions of factory_girl you have an after_build callback, so I believe you could define your factory like this:
UPDATE
After factory_girl 3.3.0, the syntax has changed to following:
@fkreusch's answer works great until you use the new RSpec
expect()
syntax (3.0+)Putting this into
rails_helper.rb
works for me:In the OP's example, you can now do:
Credit: github.com/printercu, see: https://github.com/thoughtbot/factory_girl/issues/703#issuecomment-83960003
You might also consider using FactoryGirl#build_stubbed.
A factory should produce "real world" objects therefore it's a bad practice (and error prone) to change behaviour (i.e. stub) in a factory.
You can do
and if your
before
clause gets too big you may want to extract it to a separate method or create a mock child class that overrides methods you want to stub.