1

これはコントローラーのスペックファイルにあります

it "should raise 404" do
      business = FactoryGirl.build(:business)
      expect{get :edit, :id => business}.to raise_error(ActiveRecord::RecordNotFound)
    end

私が正しければ、ビルドはデータベースに保存されないので、ビジネスは存在しないはずであり、私のテストは合格するはずですが、そうではありません。

「id」の値として文字列も試しましたが、それでも失敗します。

私はこのコントローラーアクションを試しました:

def edit
    if params[:id].to_i == 0
      name = params[:id].to_s.titleize
      @business = Business.find_by_name!(name)
    else
      @business = Business.find(params[:id])
    end
    respond_with(@business)
  end

存在しないIDであり、実際に404を示しています。

そのような条件がなぜあるのかと尋ねると、このアクションを「id」パラメーターの文字列に応答させることもできます。

ActiveRecord :: RecordNotFoundは、アプリケーションコントローラーの次のコードによって受信されます。

rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found

  private
    def record_not_found
      render :text => "404 Not Found Baby!", :status => 404
    end

404のテストに合格しないのはなぜですか?

4

2 に答える 2

4

コントローラは例外を発生させずActiveRecord::RecordNotFound、ApplicationControllerで例外をレスキューします。したがって、応答コードまたはテキストをテストしてみてください。

  it "should respond with a 404" do
    business = FactoryGirl.build(:business)
    get :edit, :id => business
    response.response_code.should == 404
  end
于 2012-06-03T08:19:43.130 に答える
2

私はパーティーに遅れていることは知っていますが、コントローラーのテストで実際にレコードを作成するべきではありません。モデルテストでレコードを作成します。

コントローラのテストで、作成が失敗することが予想される場合は、のようなものでスタブしますmy_model.stub(:save).and_return(false)。作成が成功することを期待している場合は、my_model.stub(:save).and_return(true)

ショルダーを使用して...

context "record valid" do
  before :each do
    my_model.stub(:save).and_return(true)
    post :create
  end
  it { should redirect_to(dashboard_url) }
end
于 2012-11-12T11:12:16.687 に答える