如何将自定义静态404和500错误页面添加到Rails应用程序,然后使用rspec测试它们是否有效?
答案 0 :(得分:2)
作为一个Rails Noob,我最近想在我的Rails应用程序中添加自定义静态404和500错误页面,但我找不到有效的测试方法。在各个地方都有各种各样的拼图,但对我来说,并不是所有的拼图都按我想象的方式组合在一起,所以我在这里录制我是如何让它适合我的情况的。你的里程会有所不同,这可能会有严重的缺陷。
首先,默认情况下,Rails不会在开发或测试中通过错误,因为它需要提供有关错误的良好信息。我们希望至少暂时覆盖它,以便错误通过并反映在应用程序中。
您需要设置两个配置选项。请注意,您可能会发现进行这些更改会导致测试出现其他问题。它不适合我,但我建议使用注释输入true和false配置选项,这样您就可以注释掉当前情况所需的设置。请注意,更改选项需要重新启动rails服务器(每次运行测试时都会发生这种情况,但在开发中......)。
在config / environments / test.rb中,添加,或者如果您已经在文件中的某个地方使用'config.consider_all_requests_local =',请将其替换为:
# Config for error handling in 'test'
# config.consider_all_requests_local = false # For use when you need the error info.
#
# To have errors bubble to top, to test error handling, like 404 and 500 pages, use:
config.consider_all_requests_local = true # For use in test for error handling
同样在config / environments / test.rb中,添加,或者如果某个地方已经有'config.action_dispatch.show_exceptions =',请将其替换为:
# Raise exceptions instead of rendering exception templates.
# To have errors bubble to top, to test error handling, like 404 and 500 pages, use 'true':
# config.action_dispatch.show_exceptions = false
config.action_dispatch.show_exceptions = true
然后,请记住,如果您使用rspec / capybara进行测试,则通常会与您使用的驱动程序发生冲突。对我来说,使用这些测试的驱动程序是webkit驱动程序。 (参见https://github.com/teamcapybara/capybara,并记住,适当时,添加到您的Gemfile和'捆绑')当然,该驱动程序不适用于我的所有其他测试。所以我不得不在功能测试文件中设置驱动程序。 注意测试,最简单的方法是在所有测试运行之前运行一次的before(:all)的组合,以及之前(与之前相同(:each),并在每次测试之前运行):
require 'spec_helper'
describe "Error pages" do
# Get the current Capybara driver
js_def = Capybara.javascript_driver
before (:all) {
# puts "Current javascript_driver is #{Capybara.javascript_driver}"
Capybara.javascript_driver =:webkit
# puts "Current javascript_driver is #{Capybara.javascript_driver}"
}
after (:all) {
# puts "Current javascript_driver is #{Capybara.javascript_driver}"
# Capybara.use_default_driver
Capybara.javascript_driver =js_def
# puts "Current javascript_driver is #{Capybara.javascript_driver}"
}
before {
@user = FactoryBot.create(:user, name: "Bob", email: "bob@example.com")
# @user.save!
# @user.reload
test_sign_in(@user)
}
# subject { page }
it "renders 500 error", js: true, type: :feature do
visit root_path
visit raise_error_path
expect(page.status_code).to eq(Rack::Utils::SYMBOL_TO_STATUS_CODE[:internal_server_error])
expect(page).to have_content "Apoxeia"
expect(page).to have_content "Page Not Found"
# expect(page).to have_link "Home"
end
it "renders 404 error", js: true, type: :feature do
visit root_path
visit 'clients/100'
expect(page.status_code).to eq(Rack::Utils::SYMBOL_TO_STATUS_CODE[:not_found])
expect(page).to have_content "Apoxeia"
expect(page).to have_content "Page Not Found"
expect(page).to have_link "Home"
end
请记住,您可能必须先在'spec / spec_helper.rb'(或'spec / rails_helper')中注册驱动程序,请参阅上面的Capybara链接。
最后,您需要有一个控制器/操作来进行测试。对我来说,我将此添加到static_pages控制器:
def raise_error
raise "error"
end
这是我的路线:
match '/raise_error', to: 'static_pages#raise_error', via: :get
希望这有帮助。
顺便说一句,我从来没有理解整个“动态错误的事情”。是的,很酷,但你也可以制作静态页面!并且应该通过进一步处理来处理“错误”的想法是“反直觉的”。如果你知道如何处理错误,那不是错误,它只是更多的应用程序代码。