rspec で and_call_original を使ってみる
Ruby Ruby on Rails
Published: 2019-07-27

やったこと

rspec で and_call_original を使ってみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

$ gem list | grep rspec-rails
rspec-rails (3.8.2)

調査

spec/models/task9_spec.rb

require 'rails_helper'

class Sample
  attr_reader :count
  def initialize
    @count = 0
  end

  def increment
    @count += 1
  end
end

RSpec.describe Task, type: :model do
  it '呼び出しているかどうかのテスト' do
    sample = Sample.new
    expect(sample).to receive(:increment)

    expect(sample.count).to eq(0)
    # 実際に呼び出してはいない
    sample.increment
    expect(sample.count).to eq(0)
  end

  it '実際に呼び出すテスト' do
    sample = Sample.new
    expect(sample).to receive(:increment).and_call_original

    expect(sample.count).to eq(0)
    sample.increment
    expect(sample.count).to eq(1)
  end
end

出力結果

$ rspec spec/models/task9_spec.rb

Task
  呼び出しているかどうかのテスト
  実際に呼び出すテスト

Finished in 0.00736 seconds (files took 1.75 seconds to load)
2 examples, 0 failures

and_call_original を使うと実際のメソッドが呼び出されていることが分かります。

参考