0

私の質問はもっと一般的な性質のものです。さまざまな種類のコードで作業しているときに、コントローラーのrspecテストを実行しました。一部のコードでは、レールとrspec APIを使用し、その他のコードでは、モックとスタブを使用しています。

コントローラーをテストするために組み込みのレールとrspecAPIにモックとスタブを使用することの長所短所は何ですか?誰かがどちらのアプローチが優れているかを説明できるかどうかを考えています。

一般的に、彼らは同じことをすることができます(少なくともある時点まで)。それ以外の場合、コードがどのように見えるか、またはテストをより表現力豊かにすることの違いは、

4

1 に答える 1

2

あなたの質問がなぜモックとスタブをするかについてであるならば、それから短い答えはありません。これらのタスクを使用すると、テスト中のソフトウェアの動作をより適切に制御できるため、テストがはるかに簡単になります。このようにして、テストはより速く、より単純に、より「単一」になります。

たとえば、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?が返されることを確認したいだけです。これは、スタブを使用して簡単に実行できます。truefalse

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は進化し、今日では他のものと同じくらい優れています。

于 2013-03-23T14:51:33.960 に答える