Rails 5.1引入了system testing,它使用Capybara和Selenium来测试Rails应用程序的UI。
我想知道如何使用此系统测试来测试错误页面的UI。
对于标准控制器测试,我们可以执行类似下面的操作来声明响应为404。
function CustomEmail() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("A2:I100");
var UserData = range.getValues();
for (i in UserData) {
var row = UserData[i];
var CentreNumber = row[0];
var Exam = row[1];
var ExamDate = row[4];
MailApp.sendEmail(row[8], "mrmtm2016@gmail.com", "Hello Colleague" + CentreNumber + ", This is a reminder of the scheduled Exam " + Exam);
}
}
但是对于系统测试,如果我转到404页面,将在控制器级别抛出异常并且测试会立即终止,而不会呈现页面。
test 'should get not_found' do
get errors_not_found_url
assert_response :not_found
end
在控制器级别抛出异常。
test '404 page should render with the correct title' do
# act.
visit NOT_FOUND_URL
# assert.
assert_equal("#{APP_NAME} - #{TITLE_404}", page.title)
end
在开发/测试环境下,$ rails test test/system/error/error_page_test.rb
Run options: --seed 30076
# Running:
Puma starting in single mode...
* Version 3.9.1 (ruby 2.3.1-p112), codename: Private Caller
* Min threads: 0, max threads: 1
* Environment: test
* Listening on tcp://0.0.0.0:55237
Use Ctrl-C to stop
2017-07-09 11:10:45 +1200: Rack app error handling request { GET /books/12345678 }
#<ActionController::RoutingError: Could not find book '12345678' by id or name>
/myapp/app/controllers/books_controller.rb:7:in `index'
/Users/yze14/.rvm/gems/ruby-2.3.1/gems/actionpack-5.1.2/lib/action_controller/metal/basic_implicit_render.rb:4:in `send_action'
/Users/yze14/.rvm/gems/ruby-2.3.1/gems/actionpack-5.1.2/lib/abstract_controller/base.rb:186:in `process_action'
...
可以设置为config.consider_all_requests_local
,以便显示错误页面而不是stracktrace。但这不会在系统测试期间吞下异常。
答案 0 :(得分:1)
如果您不希望Capybara在测试中重新引发服务器异常,您可以设置Capybara.raise_server_errors = false
。
其次,你应该检查你的Gemfile并确保任何宝石如web-console
,better-errrors
等只在开发环境中加载(而不是在测试环境中)
最后,您不应该将assert_equal
与title
一起使用,您应该使用提供assert_title
的Capybara,其中包括等待/重试行为,并将减少测试中的潜在瑕疵。< / p>
assert_title("#{APP_NAME} - #{TITLE_404}")