概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Ruby on Rails / RSpec - difference between stubs and mocks
- 原文公開日: 2018/01/25
- 著者: Paweł Dąbrowsk
Rails tips: RSpecのスタブとモックの違い(翻訳)
本記事を読む前にスタブやモックの使い方も調べておきましょう。
構文の違い
唯一の違いは先頭のメソッドです。スタブではallow
が先行し、モックではexpect
が先行するでしょう。
利用法の違い
スタブは、他のメソッドが実行されないようにして欲しい値を返させるものです。モックは、指定のメソッドが実行されたかどうかを、引数や頻度を指定してチェックするものです。
コード例
例から学ぶのが一番ですので、ひとつコード例をご覧ください。クラスとそれに対応するテストを作ります。
class Message
def initialize(user: user)
@user = user
end
def send
user.update_message_sent_at
name = user.name(format: 'message')
Emailer.send_message(name)
end
private
attr_reader :user
end
3つのメソッドはテストで呼びたくありませんので、これらをスタブでふさぎ、正しく実行されたかどうかをモックでチェックします。
require 'spec_helper'
describe Message do
describe '#send' do
it 'sends message' do
user = instance_double(User)
name = 'Tim'
allow(user).to receive(:name).with(format: 'message').and_return(name)
allow(user).to receive(:update_message_sent_at)
alloW(Emailer).to receive(:send_message).with(name)
message = Message.new(user: user)
message.send
expect(user).to have_received(:update_message_sent_at).once
expect(user).to have_received(:name).with(format: 'message').once
expect(Emailer).to have_received(:send_message).with(name).once
end
end
end
これでおしまいです。スタブは元のコードを実行しないようにし、モックは指定のメソッドが実際に呼ばれたかどうかをチェックします。このようなテストの構造は「スパイ」と呼ばれます。スパイについてはこちらをご覧ください。
お知らせ: RSpec & TDDの電子書籍を無料でダウンロード
もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。