あなたの質問がなぜモックとスタブをするかについてであるならば、それから短い答えはありません。これらのタスクを使用すると、テスト中のソフトウェアの動作をより適切に制御できるため、テストがはるかに簡単になります。このようにして、テストはより速く、より単純に、より「単一」になります。
たとえば、create
コントローラのアクションで、モデルが保存されているかどうかに関係なく、その動作をテストしたい場合があります。スタブしない場合は、2つの異なるインスタンスを作成する必要があります。1つは有効で、もう1つは無効です。
it "redirects to message with a notice on successful save" do
message_params = FactoryGirl.attributes_for(:message)
post :create, message_params
flash[:notice].should_not be_nil
response.should redirect_to(Message.last)
end
it "renders a :new template with a notice on unsuccessful save" do
message_params = FactoryGirl.attributes_for(:message, name: nil)
post :create, message_params
flash[:notice].should_not be_nil
response.should render_template :new
end
ご覧のとおり、Message
;の2つのインスタンスを作成する必要がありました。1つは有効でもう1つは無効です。FactoryGirlを使用して作成する必要がありました。つまり、インスタンスの作成時に他の問題が発生する可能性があるため、テストは完全に単一ではありません。私たちが本当にテストしたいのは、保存が成功した場合にページXにリダイレクトされるかどうかです。したがって、1つのケースと他のケースでそれ@message.valid?
が返されることを確認したいだけです。これは、スタブを使用して簡単に実行できます。true
false
it "should redirect to message with a notice on successful save" do
Message.any_instance.stubs(:valid?).returns(true)
post 'create'
flash[:notice].should_not be_nil
response.should redirect_to(Batch.last)
end
it "should render new template with a notice on unsuccessful save" do
Message.any_instance.stubs(:valid?).returns(false)
post 'create'
flash[:notice].should be_nil
response.should render_template('new')
end
したがって、その場合、オブジェクトのインスタンスを作成する必要がなかったため、テストは非常に軽量になり、メソッドをスタブして、返したいものを返すだけです。それを使用する理由は他にもたくさんあり、モックとスタブについてもっと読むことができます。
ただし、質問がRspecの組み込みのモックおよびスタブ機能を使用すること、またはMochaなどの外部宝石を使用することである場合、答えは短くなります。今日、私は個人的な好みについてより多くを信じています。any_instance
以前は、Mochaのようなフレームワークには、上記で使用した方法など、Rspecにはなかった機能がありました。しかし、Rspecは進化し、今日では他のものと同じくらい優れています。