Tech Racho エンジニアの「?」を「!」に。
  • 開発

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のモックとスタブの使い方


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。