Обновление [29 октября 2018 г.]: я добавил фрагменты кода в стиле Ember 3.x.
Как бы мне ни нравился Ember.js, вернувшись к нему через пару лет, я обнаружил, что тестирование (и, возможно, это просто тестирование веб-приложений в целом) чрезвычайно утомительно и запутанно (в Ember 2.x - все в порядке. > много лучше в 3.x). Частично это было связано с тем, что в проекте, которым я руководил, были тысячи полезных интеграционных -тестов, но было очень мало полностью изолированных модульных-тестов. Это было в основном из-за некоторых опрометчивых архитектурных решений, которые я не мог сразу исправить. Вот быстрый пример использования библиотеки имитаторов Sinon.js для лучшей изоляции служебного теста. (Примеры Ember 2.x и 3.x ниже.)
В моем (надуманном) примере у меня есть GraphicsCreatorService, который создаст графику и добавит его на мою веб-карту (например, на основе Leaflet или иначе), возможно, когда он получит уведомление о новых данных для отображения. В этом дизайне все взаимодействия с библиотекой карт проходят через сервис Ember, называемый «карта». Я только хочу убедиться, что картографический сервис используется для добавления графики на карту. Я хочу протестировать только GraphicsCreatorService, а НЕ логику или Leaflet MapService. Для этого изолированного теста не имеет значения, как реализован MapService.
Вот services / graphics-creator.js:
Фактическое содержание services/map.js
не имеет значения. Достаточно сказать, что у него есть метод addGraphic(graphic)
, который принимает графику и добавляет его к реальной географической карте на экране.
Первый шаг к заполнению graphics-creator-test.js
- сделать доступным Sinon.js. Вы можете использовать простой ember-qunit
, но я предпочел, чтобы ember-sinon-qunit
интегрировал его. В командной строке запустите:
ember install ember-sinon-qunit
В вашем тесте импортируйте test
, как показано ниже, вместо того, чтобы использовать один из ember-qunit:
import test from 'ember-sinon-qunit/test-support/test';
Это делает функции sinon (например, stub
, spy
и т. Д.) Доступными на this
внутри тестов (он также автоматически выполняет некоторую очистку sinon). Пока что наш тест должен выглядеть следующим образом:
Ключевые вещи, которые нужно сделать сейчас:
- Зарегистрируйте фиктивную реализацию MapService. Преимущество здесь в том, что вы можете избежать любой инициализации или другой работы, которую может выполнять настоящий MapService. Мы делаем это в функции
beforeEach()
, потому что нам, вероятно, понадобится заглушка для любых модульных тестов в этом файле. - Следите за реализацией MapService, чтобы мы могли записать, была ли вызвана функция
addGraphic
. Чтобы шпионить за ним, нам нужно выполнить поиск, чтобы получить ту же реализацию MapService, которая используется тестируемым модулем. - Вызовите функцию
GraphicsCreator.displayMyData()
. - Убедитесь, что была вызвана функция
addGraphic
.
Опять же, нам не нужно убирать слежку за картой, потому что ember-sinon-qunit
делает это за нас. В противном случае обратитесь к ember-sinon
документации для очистки. С тех пор, как я написал эту статью, я обычно перешел на использование Sinon Fakes, которые похожи на комбинацию шпионов и заглушек.
Имейте в виду, что у вас, вероятно, должно быть очень мало тестов, которые проверяют конкретную вызываемую функцию, потому что это может привести к нестабильным тестам при изменении кода. Однако в определенных ситуациях это может быть очень удобно, если вы хотите убедиться, что никто не обходит требуемый путь.