Обновление [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). Пока что наш тест должен выглядеть следующим образом:

Ключевые вещи, которые нужно сделать сейчас:

  1. Зарегистрируйте фиктивную реализацию MapService. Преимущество здесь в том, что вы можете избежать любой инициализации или другой работы, которую может выполнять настоящий MapService. Мы делаем это в функции beforeEach(), потому что нам, вероятно, понадобится заглушка для любых модульных тестов в этом файле.
  2. Следите за реализацией MapService, чтобы мы могли записать, была ли вызвана функция addGraphic. Чтобы шпионить за ним, нам нужно выполнить поиск, чтобы получить ту же реализацию MapService, которая используется тестируемым модулем.
  3. Вызовите функцию GraphicsCreator.displayMyData().
  4. Убедитесь, что была вызвана функция addGraphic.

Опять же, нам не нужно убирать слежку за картой, потому что ember-sinon-qunit делает это за нас. В противном случае обратитесь к ember-sinon документации для очистки. С тех пор, как я написал эту статью, я обычно перешел на использование Sinon Fakes, которые похожи на комбинацию шпионов и заглушек.

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