Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

RSpec | モック

概要

モック

詳細

モックは特定の引数でメソッド呼び出し時に特定の値を戻します。
スタブは単純に特定の値を返却するのに対し、モックは特定のコンテキストに応じた値を返却します。

サンプル

引数で指定されたオブジェクトから生成された乱数と
内部で生成された乱数を元にしたテキストを返却するクラスのテストを行うとします。

引数に設定したlargeフラグがtrueなら50-100の乱数を生成し、
引数に設定したsmallフラグがtrueなら0-50の乱数を生成することとします。

テスト対象

# encoding: utf-8
class Hoge
  def hoge(hage, large)
    "hoge#{hage.random1(large)}-#{random2(large)}"
  end

  def random2(large)
    if large
      rand 50..100
    else
      rand 50
    end
  end
end

class Hage
  def random1(large)
    if large
      rand 50..100
    else
      rand 50
    end
  end
end

Spec

# encoding: utf-8
require_relative "../hoge"

describe "hoge" do 
  it "hoge returns hoge large" do 
    hoge = Hoge.new

    # 引数やフィールドから設定出来る要素の場合
    hage = mock('hage')
    hage.should_receive(:random1).with(true).and_return(75)

    # 引数やフィールドから設定出来ない、内部利用のみの処理をモック化する場合
    Hoge.any_instance.should_receive(:random2).with(true).and_return(75)

    ret = hoge.hoge(hage, true)

    expect(ret).to eq("hoge75-75")
  end

  it "hoge returns hoge small" do 
    hoge = Hoge.new

    # 引数やフィールドから設定出来る要素の場合
    hage = mock('hage')
    hage.should_receive(:random1).with(false).and_return(25)

    # 引数やフィールドから設定出来ない、内部利用のみの処理をモック化する場合
    Hoge.any_instance.should_receive(:random2).with(false).and_return(25)

    ret = hoge.hoge(hage, false)

    expect(ret).to eq("hoge25-25")
  end
end

テスト結果

$rspec
..

Finished in 0.004 seconds
2 examples, 0 failures