繁体   English   中英

如何在Ruby on Rails系统测试中设置错误404页面

[英]How to setup error 404 page in Ruby on Rails system testing

Rails 5.1引入了系统测试 ,该系统测试使用Capybara和Selenium来测试Rails应用程序的UI。

我想知道如何使用此系统测试来测试错误页面的UI。

对于标准控制器测试,我们可以执行以下类似操作以将响应声明为404。

test 'should get not_found' do
  get errors_not_found_url
  assert_response :not_found
end

但是对于系统测试,如果我转到404页面,则控制器级别将引发异常,并且测试将立即终止而不呈现该页面。

test '404 page should render with the correct title' do
  # act.
  visit NOT_FOUND_URL

  # assert.
  assert_equal("#{APP_NAME} - #{TITLE_404}", page.title)
end

控制器级别引发异常。

$ rails test test/system/error/error_page_test.rb
Run options: --seed 30076

# Running:

Puma starting in single mode...
* Version 3.9.1 (ruby 2.3.1-p112), codename: Private Caller
* Min threads: 0, max threads: 1
* Environment: test
* Listening on tcp://0.0.0.0:55237
Use Ctrl-C to stop
2017-07-09 11:10:45 +1200: Rack app error handling request { GET /books/12345678 }
#<ActionController::RoutingError: Could not find book '12345678' by id or name>
/myapp/app/controllers/books_controller.rb:7:in `index'
/Users/yze14/.rvm/gems/ruby-2.3.1/gems/actionpack-5.1.2/lib/action_controller/metal/basic_implicit_render.rb:4:in `send_action'
/Users/yze14/.rvm/gems/ruby-2.3.1/gems/actionpack-5.1.2/lib/abstract_controller/base.rb:186:in `process_action'
...

在开发/测试环境下,可以将config.consider_all_requests_local设置为false ,以便显示错误页面而不是stracktrace。 但这不会吞噬系统测试期间的异常。

如果您不希望Capybara在测试中重新引发服务器异常,则可以设置Capybara.raise_server_errors = false

其次,您应该检查Gemfile并确保仅在开发环境中(而不是在测试环境中)加载任何类似web-consolebetter-errrorsbetter-errrors

最后,您不应该将assert_equaltitle一起使用,而应该使用assert_equal提供的assert_title ,其中包括等待/重assert_equal title ,这将减少测试中的潜在脆弱性。

assert_title("#{APP_NAME} - #{TITLE_404}")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM