Rspecのモックについて

今日Rspecでエラーが出ていて、どうにもこうにも解決できなくて結局上司に相談したらモック使うしかないかもという結論に至りました。

まだちゃんと理解して使えていないので予習を兼ねてまとめたいと思います。

参考資料

Ruby界隈では有名人のあの方の記事 と インスタンスメソッドのスタブについての記事

どちらの記事も勉強にさせていただきました。

モックって何よ

偽物のプログラム。Rspecとかのテスト実行中に、実際のコードに紛れ込ませてパスしたいプログラム(処理)を上書きできる

複雑な処理とか外部API使っているときに、そこまでテスト用のプログラム用意するの大変。また、目的にそぐわない(Aという目的のために複雑な処理のBを通さないといけない)場合とかに使われる。簡易的に偽物のプログラム作って目的のテストを達成しようというもの。

他にもスタブとか色々呼び方あるらしいけど今回は省きます。

使用例

it 'テストをパスする' do

 # テスト用のモックを作る
 huga_mock = double('てすと')
 
 # 上書きしたいメソッドが呼びだせるようにする
 allow(hoge_mock).to receive(:update)
 
 # Fugaクラスに hoge メソッドがあると仮定
fuga_instance = Fuga.new
 
 # hogeメソッドが呼ばれたら上で作ったモックを返すように実装を書き換える
 allow(fuga_instance).to receive(:hoge).and_return(hoge_mock)
 
end

クラス内のインスタンスメソッドを上記のように上書きできます。

ただ、このやり方はインスタンスを生成するのを別のプログラムとして切り出している場合に限るそう。参考URLのコードそのまま引用すると

class WeatherBot
 def tweet_forecast
   twitter_client.update '今日は晴れです'
 end
 
 def twitter_client
   Twitter::REST::Client.new
 end
end

というような感じで new する箇所が別になっていないと難しい。僕の実務でも new する箇所が別になっていないので、今まで書いてきたやり方は難しそう。

そういうときは new 自体をモック化させて上書きする必要があるようです。( インスタンスメソッドのスタブについての記事 参照)

明日はこちらの方法で試してみようと思います。

この記事が気に入ったらサポートをしてみませんか?