在Rails中编写自定义错误页面的测试

时间:2015-11-13 07:12:43

标签: ruby-on-rails unit-testing error-handling controller http-error

我在Rails应用程序中实现了自定义错误页面,以获取各种错误代码,如下所示:

配置/ routes.rb中

Rails.application.routes.draw do
  # ...

  [400, 401, 403, 404, 405, 406, 418, 422, 500, 503].each do |status|
    get "/#{status}", to: "application#render_error", status: status
  end 
end

应用/控制器/ application_controller.rb

class ApplicationController < ActionController::API
  # ...

  # Render an error status using JSON.
  def render_error(status=nil)
    # If there's no status, try and get it from the params, which will be the case with the error routes.
    status ||= params[:status]

    message = error_message(status)
    render json: { error: message }, status: status
  end

  def error_message(status):
    # Return a simple error message.
  end
end

到目前为止这种方法运行良好,因为未找到错误会使用我设置的错误路由自动呈现,我可以使用render_error手动呈现错误。

我试过为这些编写测试,但我无法弄清楚正确(或任何)方法。这是我到目前为止所尝试的:

class ApplicationControllerTest < ActionController::TestCase

  test "Default error route should return correct status code" do
    get "/418"
    assert_response 418
  end

  test "render_error should return correct status code" do
    render_error 418
    assert_response 418
  end
end

由于测试无法将/418解释为application控制器的操作,因此第一个失败。由于测试无法找到render_error方法,第二个失败。

我应该如何编写测试来正确测试这些?

1 个答案:

答案 0 :(得分:0)

您在此处使用的功能测试用于testing the actions within a particular controller。由于这些操作未在ApplicationController中明确定义,因此您遇到了问题。

您可以将这些测试重写为integration tests(保存在test / integration /文件夹中),如下所示:

class ErrorsTest < ActionDispatch::IntegrationTest

  test "Default error route should return correct status code" do
    get "/418"
    assert_response 418
  end

end 

这有点不标准,因为集成测试通常用于测试多个控制器的交互,即应用程序的流程。

我个人更喜欢Rspec并将其写为request specs