我的控制器正在抛出ActiveRecord::RecordNotFound
,这是预期转换为404的内容。
现在我想在我的控制器规范中测试这种行为,但它得到了异常,而不是等于404的response_code
。如何使它获得此代码?
Rails引发ActiveRecord::RecordNotFound
时,它只是告诉您ActiveRecord无法在数据库中找到资源(通常使用find
)。
您有责任捕获异常并执行您想做的任何事情(在您的情况下,返回404未找到的http错误)。
说明上述内容的一个简单实现是通过执行以下操作:
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
rescue_from ActiveRecord::RecordNotFound, with: :not_found
private
def not_found
render file: 'public/404.html', status: 404, layout: false
end
end
这样,每当rails从继承自ApplicationController
的任何控制器抛出ActiveRecord::RecordNotFound
时,它都会被拯救,并呈现位于public/404.html
的404 rails默认页面
现在,为了测试这个:
spec/controllers/application_controller_spec.rb
require 'spec_helper'
describe ApplicationController do
describe "ActiveRecord::RecordNotFound exception" do
controller do
def index
raise ActiveRecord::RecordNotFound.new('')
end
end
it "calls not_found private method" do
expect(controller).to receive(:not_found)
get :index
end
end
end
您需要在spec/spec_helper.rb
中添加以下内容
config.infer_base_class_for_anonymous_controllers = true