Rails tips: RSpecのスタブとモックの違い(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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』をどうぞお役立てください。

関連記事

ソフトウェアテストでstubを使うコストを考える(翻訳)

[Rails] RSpecのモックとスタブの使い方

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ