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追記: ライブラリ名をずっと間違えて書いていたのでしれっと直した。