【发布时间】:2012-06-27 03:37:36
【问题描述】:
我的 Rails 应用程序中有一个自定义错误页面,测试 404 错误似乎很简单(获取不存在的页面并对某些文本执行 assert_match/select),但我想知道如何测试 500 错误页面。
有什么想法吗?
【问题讨论】:
标签: ruby-on-rails
我的 Rails 应用程序中有一个自定义错误页面,测试 404 错误似乎很简单(获取不存在的页面并对某些文本执行 assert_match/select),但我想知道如何测试 500 错误页面。
有什么想法吗?
【问题讨论】:
标签: ruby-on-rails
所以我发现我可以在 rspec 中做这样的事情
def other_error
raise "ouch!"
end
it "renders 500 on Runtime error" do
get :other_error
response.should render_template("errors/500")
response.status.should == 500
end
【讨论】:
other_error 方法,而不是您的 rspec 测试中的辅助方法,对吧?我希望后者工作,但认为这是一个梦想。
假设您使用的是rspec、rspec-mocks 和capybara,这就是我所做的:
首先,您需要找到调用方法的控制器操作。例如,您可能有一个UserController 和一个调用User.find 的show 操作。在这种情况下,您可以执行以下操作:
it "should render the 500 error page when an error happens" do
# simulate an error in the user page
User.should_receive(:find).and_raise("some fancy error")
visit '/user/1'
# verify status code
page.status_code.should eql(500)
# verify layout
page.title.should eql('Your site title')
page.should have_css('navigation')
page.should have_css('.errors')
end
【讨论】:
如果您使用的是 rspec,则可以使用 controller 块并在那里定义一些正在测试的测试操作:
describe ApplicationController, type: :controller do
controller do
def index
fail 'Something bad happened'
end
end
it 'returns an error page'
get :index
expect(response.status).to eq 500
expect(response).to render_template 'errors/500'
end
end
type: :controller 很重要,否则 RSpec 不会公开 controller 方法(尽管您可能已经这样做了)。
【讨论】:
allow(User).to receive(:find).and_raise('500 error')
get "/users/#{user.id}"
expect(response.status).to eq 500
【讨论】: