Статьи

Интеграция Jasmine в Rails для надежного тестирования JavaScript

jasmine_vertical

Jasmine — это фреймворк для создания тестов для кода JavaScript в стиле разработки на основе поведения. В этой статье вы узнаете, как интегрировать Jasmine в приложение Ruby on Rails .

Жасмин имеет чистый синтаксис с целью обеспечения описательного поведения в тестируемом коде. Люди, которые используют RSpec или Minitest::Spec Даже если вы не использовали ни одну из этих платформ, у вас не возникнет трудностей при создании тестов для Jasmine.

Прочитав эту статью, вы сможете интегрировать Jasmine в ваше приложение Rails, создавать тесты для своих файлов JavaScript, тестировать функциональность UJS Rails внутри своего приложения и сможете запускать Jasmine как часть своего существующего (верно ?? ) Непрерывная интеграция существующей системы сборки.

Установка

Чтобы иметь работающую установку Jasmine в приложении Rails, вам нужно поместить jasmine-gem в Gemfile Убедитесь, что он находится внутри группы developmenttest

 group :development, :test do
  gem "jasmine"
end

Затем выполните следующий шаг, чтобы установить гем:

 bundle install

После завершения установки драгоценного камня запустите генератор жасмина следующим образом:

 rails generate jasmine:install

Генератор выведет что-то вроде этого на терминал:

 create  spec
create  spec/javascripts/helpers/.gitkeep
create  spec/javascripts/support/jasmine.yml
create  spec/javascripts/support/jasmine_helper.rb

Это необходимые файлы для запуска Жасмин. Подробная информация о настройке вашей установки Jasmine будет объяснена в разделе конфигурации.

использование

После завершения шагов установки вы сможете запустить Jasmine. Jasmine можно запустить несколькими различными способами: вы можете запустить Jasmine в браузере или в режиме непрерывной интеграции (CI). Преимущество использования режима CI состоит в том, что вы можете интегрировать его в свою систему сборки.

Запустить в браузере

Прежде чем вы сможете запустить Jasmine в своем браузере, вам нужно запустить сервер Jasmine:

 rake jasmine

Затем укажите ваш браузер на следующий URL:

 http://localhost:8888/

Чтобы посмотреть, как выглядят результаты теста, гем предоставляет еще один генератор для создания тестовых примеров. В другом терминальном сеансе выполните следующую команду:

 rails generate jasmine:examples

Ниже приведен скриншот сгенерированных примеров результатов теста:

жасмин-тесты, результат

Вы можете видеть, что есть кнопка в правом верхнем углу страницы. У него есть несколько опций, которые изменяют, как Jasmine запускает тесты. Давайте разберемся с доступными опциями, подробно объясненными.

Возбудить исключения

При выборе этого параметра он будет перенаправлен на следующий URL:

 http://localhost:8888/?catch=false

Эта опция отключает отлов ошибок в исходном коде JavaScript и в тестовом файле Jasmine. Без этой опции все ошибки в тестовых и исходных файлах помещаются в блок catch.

Преимущество включения этой опции состоит в том, что она позволяет преднамеренно искажать результаты теста Жасмин в случае ошибки. Следовательно, вы знаете, что ошибка связана с ошибкой, а не с ошибкой.

Остановить спецификацию в случае ошибки ожидания

При выборе этого параметра он будет перенаправлен на следующий URL:

 http://localhost:8888/?throwFailures=true

Эта опция немедленно прекращает работу спецификации. Давайте посмотрим на следующий пример кода:

 it("should not be possible to play", function() {
  player.stop();
  expect(player.isPlaying).toBeFalsy();
  expect(player.currentlyPlayingSong).not.toEqual(song);
});

Без этой опции ошибка спецификации выводит все сообщения об ошибках ожидания для ошибки спецификации:

 ..F..
Failures:
          Player when song has been paused should be possible to resume

          Expected true to be falsy.
          Error: Expected true to be falsy.

          Expected Song({  }) not to equal Song({  }).
          Error: Expected Song({  }) not to equal Song({  }).

С этой опцией, ошибочная спецификация только выводит первое сообщение об ошибке ожидания, а затем останавливает выполнение ошибочной спецификации.

 ..F..
Failures:
          Player when song has been paused should be possible to resume

          Expected true to be falsy.
          Error: Expected true to be falsy.

Выполнять тесты в случайном порядке

При выборе этого параметра он будет перенаправлен на следующий URL:

 http://localhost:8888/?random=true

Эта опция позволяет запускать тест в случайной последовательности при каждом запуске теста. Без этой опции все тесты будут выполняться в одной и той же последовательности при каждом запуске теста.

Преимущество включения этой опции заключается в выявлении зависимостей между тестами, поэтому вы можете уменьшить зависимости тестов, и каждый тест будет иметь хорошую изоляцию.

Запустить как непрерывную интеграцию

Вы можете интегрировать Jasmine в рабочий процесс Continuous Integration с помощью браузера без головы. К счастью, гем уже поддерживает интеграцию с безголовым браузером.

Чтобы запустить Jasmine в режиме CI, запустите его следующим образом:

 rake jasmine:ci

Безголовая интеграция с браузером использует PhantomJS . Если в вашей системе не установлен PhantomJS, он попытается загрузить его, прежде чем вы сможете запустить его в режиме CI.

Приведенная выше команда выводит что-то вроде этого:

 Waiting for jasmine server on 49948...
jasmine server started
.....
5 specs, 0 failures

По умолчанию Жасмин пытается найти случайный открытый порт в режиме CI. Чтобы установить порт, вы можете настроить порт в jasmine_helper.rb :

 Jasmine.configure do |config|
   config.ci_port = 1234
end

конфигурация

Конфигурация по умолчанию должна служить вам просто отлично. Но, если вам нужна другая конфигурация, для этого можно использовать два файла: jasmine.yml и jasmine_helper.rb .

Прежде чем двигаться дальше, вы должны знать, что некоторые параметры конфигурации не применяются, если они запускаются из браузера. В этом случае используйте меню «Параметры» при запуске из браузера:

Загрузите конфигурации Jasmine со следующей последовательностью:

  1. Жасмин сначала читает файл конфигурации jasmine.yml .
  2. Jasmine читает jasmine_helper.rb и переопределяет конфигурацию, определенную
    jasmine.yml .

jasmine.yml

Вот пример доступной конфигурации в jasmine.yml со значениями по умолчанию:

 # spec/javascripts/support/jasmine.yml
random: false
show_console_log: false
stop_spec_on_expectation_failure: false

jasmine_helper.rb

Вот пример доступной конфигурации в jasmine_helper.rb со значением по умолчанию:

 # spec/javascripts/support/jasmine_helper.rb
Jasmine.configure do |config|
  config.random = false
  config.show_console_log = false
  config.stop_spec_on_expectation_failure: false

  config.show_full_stack_trace = false
  config.prevent_phantom_js_auto_install = false
  config.server_port = 8888

  # ci port is random by default
  # config.ci_port = 1234
end

тестирование

Тестирование файлов JavaScript с использованием Jasmine в приложении Rails должно быть довольно простым. Он использует те же стандарты, что и Jasmine в целом, но есть вещи, которые необходимо учитывать для установки Jasmine в Rails.

Тестирование JavaScript

Тестовые файлы для JavaScript в приложении rails находятся в папке spec / javascripts . Для каждого файла javascript необходимо поместить тестовый файл в тот же путь, что и файл. Например, если в вашем приложении есть следующий файл javascript:

Приложение / активы / JavaScripts / jasmine_examples / Player.js

Вы помещаете файл спецификации по следующему пути:

спецификации / JavaScripts / jasmine_examples / PlayerSpec.js

Жасмин включит тест на следующий тестовый прогон. Конфигурация для запуска теста отсутствует. Чтобы проверить ваш файл JavaScript, вам нужно обратиться к документации Jasmine .

Рельсы UJS

Rails UJS может быть сложно протестировать, потому что ответ может быть в любом формате, например, JavaScript, JSON или HTML. Независимо от формата ответа, вы все равно можете тестировать Rails UJS, используя Jasmine.

Есть 3 части, которые нужно идентифицировать:
— Ссылка UJS.
— Ответ.
— побочный эффект.

Как только вы определили вышеуказанные требования, вы можете создать фиктивный ответ, вызвать UJS и заявить о побочном эффекте. Например, следующий код тестирует ссылку UJS, которая удаляет элемент DOM со страницы:

 it("removes the associated element", function(){
  var response = { status: 200 };
  $('a.remove#123').trigger('ajax:success', response, 'xhr');
  expect($('li#123')).toEqual([]);
});

Из приведенного выше примера, запуск ссылки UJS может быть выполнен с использованием ajax:success Списки завершенных событий, которые могут быть вызваны, можно увидеть в документации по Rails UJS .

Плагины

Иногда вам нужны инструменты, которые помогут повысить вашу производительность. Этот раздел служит кратким введением для некоторых плагинов, созданных сообществом. Для более подробной информации о каждом плагине, посетите официальный репозиторий плагинов.

Перед установкой каких-либо плагинов необходимо правильно настроить конфигурацию, чтобы плагины могли быть правильно загружены до запуска тестов. Внутри корневого пути приложения создайте папку для плагинов:

 mkdir spec/javascripts/plugins/

А внутри jasmine.yml добавьте вышеуказанную папку в раздел helpers

 helpers:
  - 'plugins/**/*.js'

Жасмин-Jquery

jasmine-jquery предоставляет сопоставления jQuery в Jasmine. Это средство сопоставления предоставляет множество удобных средств сопоставления, связанных с jQuery, что позволяет повысить производительность тестирования. Загрузите последнюю версию плагина
здесь

Взгляните на следующий пример:

 expect($('<div>some text</div>')).toHaveText(/some/)

Как и со стандартными сопоставителями Jasmine, вы также можете инвертировать его, используя префикс .not

 expect($('<div>some text</div>')).not.toHaveText(/other/)

Жасмин-Matchers

Jasmine-Matchers — это инструмент для предоставления дополнительных сопоставителей в Jasmine. Кроме того, он также предоставляет более дружественное сообщение об ошибке ожидания по сравнению со стандартным. Загрузите последнюю версию плагина здесь .

В следующем тесте используются сопоставители по умолчанию для Jasmine:

 it('should distribute evenly', function() {
  expect(basket.items % 2 === 0).toEqual(true);
});

И это печатает следующее сообщение об ошибке:

 Expected false to equal true

Используя jasmine-matchers, тест выглядит так:

 it('should distribute evenly', function() {
  expect(basket).toHaveEvenNumber('items');
});

С более дружелюбным сообщением об ошибке:

 Expected member "items" of { items : 25 } to be even number.

Жасмин-Крепеж

Jasmine-Fixture — это плагин, который обеспечивает создание DOM с помощью CSS-селекторов, поэтому вы можете гораздо проще взаимодействовать с DOM. Это также поможет вам избежать загрязнения теста, удаляя DOM, созданный плагином после каждого запуска теста. Загрузите последнюю версию плагина здесь .

Если вы не используете jasmine-fixture, вы можете сделать это для взаимодействия с DOM:

 beforeEach(function(){
  $('<div id="toddler"><div class="hidden toy"><input name="toyName" value="cuddle bunny"></div></div>').appendTo('body');
});

afterEach(function(){
  $('#toddler').remove()
});

Используя jasmine-fixture, вам просто нужно сделать это:

 beforeEach(function(){
  affix('#toddler .hidden.toy input[name="toyName"][value="cuddle bunny"]')
});

Вывод

Интеграция Jasmine в приложение Rails включена с помощью jasmine-gem. Функции, предоставляемые гемом, дают гибкость в том, как запускать тесты, либо из браузера, либо в виде опции непрерывной интеграции. Jasmine также можно настроить в соответствии с вашими потребностями, такими как выполнение тестового поведения и настройка плагинов. Использование плагинов, таких как jasmine-jquery, jasmine-matchers и jasmine-fixtures, поможет повысить эффективность тестирования JavaScript.