モックを使ってAPIをテスト

product code

# 注:本当に動かす場合はtwitter gemが必要です
require 'twitter'

class WeatherBot
  def tweet_forecast
    twitter_client.update '今日は晴れです'
  end

  def twitter_client
    Twitter::REST::Client.new
  end
end

test code

it 'エラーなく予報をツイートすること' do
  # Twitter clientのモックを作る
  twitter_client_mock = double('Twitter client')
  # モックがupdateメソッドが呼びだせるようにする
  allow(twitter_client_mock).to receive(:update)
  # expectにすることでメソッド呼び出しの検証も一緒にできる
  expect(twitter_client_mock).to receive(:update)

  # インスタンス化しただけではAPI通信は発生しないので許容
  weather_bot = WeatherBot.new
  # twitter_clientメソッド(API通信を行うメソッド)が呼ばれたら上で作ったモックを返すように実装を書き換える
  allow(weather_bot).to receive(:twitter_client).and_return(twitter_client_mock)

  expect{ weather_bot.tweet_forecast }.not_to raise_error
end

疑問

モックを作ってメソッドも偽装できたのはわかったけど、インスタンスの内容はどうなってる?