TL/DR
rspecのテストを書いてる時
メソッドが呼び出されているかどうかだけ
確認したい時、ありませんか?
そんな時のやり方です。
rspec-mocksのSpyという機能を使います
Test Spies
https://github.com/rspec/rspec-mocks#test-spies
# メソッドを監視するコード
allow(オブジェクト).to receive(:メソッド名)
# テストコード
expect(オブジェクト).to have_received(:メソッド名).once
のような感じ。
code
例えばこんなメソッドがあって、
振る舞いのテストを作成したい時に
class Order
def create(order)
if order.save
Bill.create(order)
NoticeMailer.new(email: order.email).send()
'success!'
else
'error!'
end
end
end
Bill.create(order)や
NoticeMailer.new(email: order.email).send()は
別のとこでテストしているから、もういいんだよ。
でもちゃんと呼ばれているかだけ
確認しときたいって時。
describe '#create' do
let(:new_order){ build(:new_order) }
before do
allow(Bill).to receive(:create)
allow(NoticeMailer).to receive_message_chain(:new, :send)
end
context 'no user' do
it do
Order.create(new_order)
expect(Bill).to have_received(:create).once
expect(NoticeMailer.new).to have_received(:send).once
end
end
end
こんな感じになります。
environment
$ rails -v
Rails 4.2.6
$ bundle exec rspec -v
3.4.4
thank you ..