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

前端 未结 4 2031
深忆病人
深忆病人 2021-02-18 12:39

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_retu         


        
相关标签:
4条回答
  • 2021-02-18 13:24

    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.

    0 讨论(0)
  • 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
      end
    end
    

    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
      end
    end
    
    0 讨论(0)
  • 2021-02-18 13:43

    @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::ExampleMethods
    end
    

    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
      end
    end
    

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

    0 讨论(0)
  • 2021-02-18 13:45

    You might also consider using FactoryGirl#build_stubbed.

    0 讨论(0)
提交回复
热议问题