11

Railsコントローラーの仕様を書いています。これは私がテストしているアクションです:

def create
  @course = Course.new(params[:course])
  if @course.save then
    #flash[:notice] = 'Course Created'
    redirect_to courses_path
  else
    render :action => 'new', :status => 400
  end
end

そして、これはそれを検証する仕様です:

describe "POST /courses [Good Input]" do

  it "should redirect to Courses index page after creation" do
    @course.stub!(:save).and_return(true)
    post :create
    response.should be_success
    response.should redirect_to(courses_path)
  end

end

それでも、RSpec からこのエラーが発生します。

'CoursesController POST /courses [適切な入力]

作成後にコースインデックスページにリダイレクトする必要があります」

失敗した

「/courses」へのリダイレクトが期待されていましたが、リダイレクトされませんでした

なぜこれが起こるのですか?

解決した

rishavrastogiが述べたように、be_success2xx の範囲の http コードを想定し、リダイレクトは 3xx の範囲 (実際には 302) に分類されます。

アサーションを => response.should be_redirectに変更する必要があります。

ただし、この場合、応答がリダイレクトであることを確認してから、特定のページにリダイレクトされることを確認するのは冗長であるため、アサーションはもう必要ありません。

4

2 に答える 2

5

私もRSpec-erではありませんが、応答は実際には「HTTP成功」ではなく「HTTPリダイレクト」であるため、「response.should be_success」はそこにあるべきではないと思います...したがって、response.should be_successを削除してみてください

また変更

投稿:作成

post :create, :course => {}
于 2009-03-16T09:12:25.407 に答える
0

私はrspecerではありませんが、あなたは次のようなことをしなければなりませんassigns(:course).stub!...。スペックのインスタンス変数はコントローラーのインスタンス変数と同じではないassignsため、コントローラーのインスタンス変数にアクセスできます。

于 2009-03-15T16:50:14.083 に答える