24

Rails 3.2.9では、次のようなカスタムエラーページが定義されています。

# application.rb
config.exceptions_app = self.routes

# routes.rb
match '/404' => 'errors#not_found'

これは期待どおりに機能します。設定config.consider_all_requests_local = falseすると、訪問したときdevelopment.rbにビューが表示されますnot_found/foo

しかし、Rspec + Capybaraでこれをテストするにはどうすればよいですか?

私はこれを試しました:

# /spec/features/not_found_spec.rb
require 'spec_helper'
describe 'not found page' do
  it 'should respond with 404 page' do
    visit '/foo'
    page.should have_content('not found')
  end
end

この仕様を実行すると、次のようになります。

1) not found page should respond with 404 page
  Failure/Error: visit '/foo'
  ActionController::RoutingError:
    No route matches [GET] "/foo"

どうすればこれをテストできますか?

編集:

言及するのを忘れた:私config.consider_all_requests_local = falsetest.rb

4

5 に答える 5

30

問題のあるtest.rbの設定は、

consider_all_requests_local = false

だけでなく、

config.action_dispatch.show_exceptions = true

これを設定すると、エラーをテストできるはずです。アラウンドフィルターでは使えませんでした。

http://agileleague.com/blog/rails-3-2-custom-error-pages-the-exceptions_app-and-testing-with-capybara/をご覧ください。

于 2013-01-03T15:23:55.603 に答える
1

設定は、開発用に行ったのと同じ方法で設定config.consider_all_requests_local = falseする必要があります。config/environments/test.rb

すべてのテストでこれを行いたくない場合は、次のように、テストの前に状態を設定し、後で復元するために、フィルターの周りの rspecが役立つ可能性があります。

# /spec/features/not_found_spec.rb
require 'spec_helper'
describe 'not found page' do
  around :each do |example|
     Rails.application.config.consider_all_requests_local = false
     example.run
     Rails.application.config.consider_all_requests_local = true
  end

  it 'should respond with 404 page' do
    visit '/foo'
    page.should have_content('not found')
  end
end
于 2012-12-21T20:19:42.093 に答える