モックとスタブ

やっぱりモックとスタブの違いがわからんとです。
使いわけもわからんとです。


とりあえず 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みたいなブロック付きメソッドのスタブってどうやって書くのかなぁ。。。。

*1:ゲームプログラミングなんてやった事はないんだけどさ

*2:みなさんに確認

*3:大事な事なので、もういちど確認しました

*4:つもり