Should I stub the model in Factory girl or in the spec file while testing? Should I stub the model in Factory girl or in the spec file while testing? ruby ruby

Should I stub the model in Factory girl or in the spec file while testing?


@fkreusch's answer works great until you use the new RSpec expect() syntax (3.0+)

Putting this into rails_helper.rb works for me:

FactoryBot::SyntaxRunner.class_eval do  include RSpec::Mocks::ExampleMethodsend

In the OP's example, you can now do:

FactoryBot.define do  factory :cimg_for_testing_tags do    ... # Factory attributes    after(:build) do |cimg|      allow(cimg).to receive(:validate_img) { true }    end  endend

Credit: github.com/printercu, see: https://github.com/thoughtbot/factory_bot/issues/703#issuecomment-83960003


In recent versions of factory_girl you have an after_build callback, so I believe you could define your factory like this:

FactoryGirl.define do  factory :cimg_for_testing_tags do    ... # Factory attributes    after_build do |cimg|      cimg.stub(:validate_img).and_return true    end  endend

UPDATE

After factory_girl 3.3.0, the syntax has changed to following:

FactoryGirl.define do  factory :cimg_for_testing_tags do    ... # Factory attributes    after(:build) do |cimg|      cimg.stub(:validate_img).and_return true    end  endend


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

let(:user) instance_double(User, FactoryGirl.attributes_for(:user))before do  allow(user).to receive(:something).and_return('something')end

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.