responders と RSpec

responders で書き換えられた scaffold で RSpec が通らなくなる件。

Post の内容がエラーかどうかを判定するのに、 scaffold では AR::Base#save の戻り値で判定しているため、Spec は次のようになっている。(ここでは ItemsController の Spec と仮定する)

      it "re-renders the 'new' template" do
         # Trigger the behavior that occurs when invalid params are submitted
        Item.any_instance.stub(:save).and_return(false)
        post :create, {:item => {}}, valid_session
         response.should render_template("new")
       end

一方で responders で生成されるコントローラの判定は respond_with(@resource) で行われるため、AR::Base#errors の内容で判定される。
そのため save を stub してしまうと、 errors が生成されないためエラーと判断されない。

save を stub しないようにして、 invalid なパラメータを与え save に失敗し errors を生成するか、あるいは errors を stub してやればよい。

        Item.any_instance.stub(:save).and_return(false)
        Item.any_instance.stub(:errors).and_return({:name => 'invalid'})
        post :create, {:item => {}}, valid_session

2012-05-22追記: ライブラリ名をずっと間違えて書いていたのでしれっと直した。