我在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
方法,第二个失败。
我应该如何编写测试来正确测试这些?
答案 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。