将自定义静态404和500错误页面添加到Rails应用程序,并测试它们是否有效?

时间:2018-02-17 17:31:19

标签: ruby-on-rails rspec http-status-code-404 http-status-code-500

如何将自定义静态404和500错误页面添加到Rails应用程序,然后使用rspec测试它们是否有效?

1 个答案:

答案 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

希望这有帮助。

顺便说一句,我从来没有理解整个“动态错误的事情”。是的,很酷,但你也可以制作静态页面!并且应该通过进一步处理来处理“错误”的想法是“反直觉的”。如果你知道如何处理错误,那不是错误,它只是更多的应用程序代码。