Jasmine — это фреймворк для создания тестов для кода JavaScript в стиле разработки на основе поведения. В этой статье вы узнаете, как интегрировать Jasmine в приложение Ruby on Rails .
Жасмин имеет чистый синтаксис с целью обеспечения описательного поведения в тестируемом коде. Люди, которые используют RSpec или Minitest::Spec
Даже если вы не использовали ни одну из этих платформ, у вас не возникнет трудностей при создании тестов для Jasmine.
Прочитав эту статью, вы сможете интегрировать Jasmine в ваше приложение Rails, создавать тесты для своих файлов JavaScript, тестировать функциональность UJS Rails внутри своего приложения и сможете запускать Jasmine как часть своего существующего (верно ?? ) Непрерывная интеграция существующей системы сборки.
Установка
Чтобы иметь работающую установку Jasmine в приложении Rails, вам нужно поместить jasmine-gem в Gemfile
Убедитесь, что он находится внутри группы development
test
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 со следующей последовательностью:
- Жасмин сначала читает файл конфигурации jasmine.yml .
- 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.