factory girl で特定のメソッドを rspec-mock の stub で潰す

備忘録。

外部APIを呼ぶメソッド、処理に時間のかかるメソッドなど、普段のテストでは不要であるメソッドは factory 側で潰すと楽。

FactoryGirl.define do
  factory :user do
    transient do
      stubs [:call_external_api]
    end

    after :build do |user, evaluator|
      evaluator.stubs.each do |m|
        r = RSpec::Mocks::Matchers::Receive.new(m, -> {})
        RSpec::Mocks::AllowanceTarget.new(user).to r
      end
    end

もし User#call_external_api のテストをしたい場合は stubs を空にすれば良い。

user = build :user, stubs: []
user.call_external_api
#=> call_external_api が呼べる。