Как сделать так, чтобы ваши тесты провалились в случае ошибок Javascript с capybara и chrome headless

Честно говоря, мы, разработчики Rails, на самом деле не привыкли часто тестировать Javascript. Может быть, потому что у нас этого мало, может быть, потому что мы просто ленивы. И это не так уж и сложно! Пожалуйста, посмотрите jasmine-rails. Он отлично работает, и вам обязательно стоит его использовать.

Я развернул ошибку

Вчера я развернул в продакшене очень неприятную ошибку JS. Было неловко, потому что он был зарегистрирован в консоли и был на домашней странице. Я имею в виду: вам не нужно было ничего делать, чтобы найти его, это было просто на первой странице моего приложения. Это не мешало ему работать, иначе мои системные тесты поймали бы его, но он отображал раздражающий красный крест.

Выявление ошибок JS в системных тестах

"Почему я не могу обнаружить это в моих системных тестах?" Я думал. И я решил добавить это в свой rails_helper.rb.

config.after(:each, type: :system, js: true) do
  errors = page.driver.browser.manage.logs.get(:browser)
  if errors.present?
    aggregate_failures 'javascript errrors' do
      errors.each do |error|
        expect(error.level).not_to eq('SEVERE'), error.message
        next unless error.level == 'WARNING'
        STDERR.puts 'WARN: javascript warning'
        STDERR.puts error.message
      end
    end
  end
end

Этот скрипт был протестирован с headless_chrome и Capybara и

  1. Делает ваш тест неудачным для каждого сообщения о СЕРЬЕЗНОЙ ошибке, зарегистрированного в консоли, печатая сообщение.
  2. Отображать предупреждение для каждого предупреждения javascript, возникающего в консоли.

Вот реальный пример результатов системного теста, который я уже провел для домашней страницы:

WARN: javascript warning
http://127.0.0.1:60979/assets/application.js 9457 Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience.
Got 3 failures and 1 other error from failure aggregation block "javascript errrors":
1) http://127.0.0.1:60481/sso 10:18 Uncaught SyntaxError: Unexpected token ;

👏 Красиво! Наш тест не проходит из-за ошибки JS, а также выводит мне предупреждение о другой проблеме.

После выполнения всего набора моих системных тестов я смог отловить больше ошибок и предупреждений и легко исправить их все.

Надеюсь, вы найдете это полезным!