モックとスタブ
やっぱりモックとスタブの違いがわからんとです。
使いわけもわからんとです。
とりあえず http://d.hatena.ne.jp/takihiro/20081023/1224762895 これが一番しっくり来てるんだけど、実際自分で書こうとすると、やっぱり使いわけできないというか。。。モックっていつ使うの?
たとえば。。。
- Gameクラス*1
- セーブするとセーブデータが保存される
- Game#saved? でセーブデータがあるかどうか確認できる
てな仕様があったとして Game#saved? の spec は
describe Game, "セーブデータが存在する時" do before do @game = Game.new end it "trueを返す" do File.stub!(:exists?).with('save_data').and_return(true) @game.saved?.should be_true end end
これがスタブだよね。*2
実際 'save_data' というファイルがあろうが、なかろうが、あった事にできる。みたいな。
これがというか Fileクラスに対してスタブを設定してるんだよね?*3
って、ここまでは理解できた。*4
最初 http://d.hatena.ne.jp/takihiro/20081023/1224762895 を読んだ時「stub! を使うとスタブで should_receive を使うとモック」という風に理解してしまったんだけど、自分で書いてみると、どうもそうじゃないっぽい。どっちもスタブじゃないのかという疑問が湧いて「じゃぁモックって何さ」という事にグルグルルグルグル。。。
ブレイクスルー
モックが何なのか、なんとなくはわかっている。
さっきのスタブの例ではメソッド(と、その戻り値)を、でっちあげたがクラス(オブジェクト)は既存のFileクラスのままだった。
じゃぁモックはというとクラス(オブジェクト)も、でっちあげるという事ではないかと。
と、 Young risk taker.: [RSpec] Mock API を読んでブレイクスルー
オブジェクトのモックつくってでっちあげー、そいつにスタブでメソッドもでっちあげー☆
ってことかと。
最近の悩み
File.foreach('data') do |line| data = line.split hoge_method data.first end
File.foreachみたいなブロック付きメソッドのスタブってどうやって書くのかなぁ。。。。