如何在Ruby on Rails系统测试中设置错误404页面

时间:2017-07-08 23:29:18

标签: ruby-on-rails ruby selenium capybara

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。但这不会在系统测试期间吞下异常。

1 个答案:

答案 0 :(得分:1)

如果您不希望Capybara在测试中重新引发服务器异常,您可以设置Capybara.raise_server_errors = false

其次,你应该检查你的Gemfile并确保任何宝石如web-consolebetter-errrors等只在开发环境中加载(而不是在测试环境中)

最后,您不应该将assert_equaltitle一起使用,您应该使用提供assert_title的Capybara,其中包括等待/重试行为,并将减少测试中的潜在瑕疵。< / p>

assert_title("#{APP_NAME} - #{TITLE_404}")