В этом посте я расскажу о любимой всеми теме в программировании, о которой вы все слышали, — о тестировании!

Тестирование в Ember может быть немного сложным, когда вы только начинаете работать с фреймворком. Но, потратив время на изучение и понимание Ember, я обнаружил, что с ним легко работать и создавать, учитывая, что я все еще не эксперт в этом (хотя я стал лучше в этом).

Сегодня я расскажу, как писать тесты для маршрутов Ember с помощью модульного тестирования.

Прежде чем мы начнем, я должен упомянуть, что мы будем использовать модуль ember-sinon, чтобы использовать все удобные инструменты для тестирования. Без него написание тестов было бы невыносимо. Чтобы установить ember-sinon, я установил ember-sinon-qunit, и он установит ember-sinon как дополнение. Причина, по которой я это сделал, заключается в том, что на их странице github не было никаких инструкций по установке ember-sinon с помощью ember. Хотя я думаю, вы можете попробовать сделать ember install ember-sinon в терминале в папке вашего проекта, и это тоже должно сработать.

Для начала давайте воспользуемся Ember CLI для создания маршрута (мы предполагаем, что вы уже создали свой проект):

ember g route fun-route

Это установит fun-route.js в ваш каталог app/routes вместе с шаблоном (который нам не понадобится для этого руководства) и fun-route-test.js в файлеtests/unit/routes.

Затем мы установим ember-sinon. Убедитесь, что вы находитесь в каталоге приложения или клиента вашего проекта, и выполните следующие действия:

ember install ember-sinon-qunit

и это должно установить ember-sinon.

Теперь, когда у нас есть два основных ингредиента, давайте углубимся и начнем программировать!

Вот код для нашего fun-route.js:

// fun-route-test.js
import { moduleFor, test } from 'ember-qunit';
import Ember from 'ember';
import sinon from 'sinon';
let route
moduleFor('route:fun-route', 'Unit | Route | fun-route', {
  // Specify the other units that are required for this test.
  // needs: ['controller:foo']
  beforeEach() {
    route = this.subject({
      transitionTo: sinon.spy()
      controller: Ember.Object.create({
      	foods: []
      })
    })
  }
});
test('call updateFoodsArray action and update foods', function(assert) {
  assert.equal(route.controller.foods.length, 0);
route.send('updateFoodsArray', 'pho')
assert.equal(route.controller.foods.length, 1);
  assert.deepEqual(route.controller.foods, ['pho']);
});
test('call linkTo action and transitionTo', function(assert) {
  route.send('linkTo', 'route-name')
assert.ok(spy.calledOnce)
  assert.ok(spy.calledWith('route-name'))
})

Как видите, мы импортировали sinon, чтобы использовать шпионские функции, которые он предоставляет. Больше информации об этом в их руководстве и многих других инструментах, которые вы можете использовать для тестирования!

У нас есть метод beforeEach() внутри модуляFor, чтобы мы не повторялись для каждого теста, иначе нам пришлось бы переопределять маршруты для каждого теста с одинаковыми свойствами.

В первом тесте у нас есть route.send(‘actionName’, ‘args’) . Это вызовет наши действия в нашем файле js, чтобы мы могли проверить его функциональность. Обратите внимание, что если бы у нас было несколько аргументов, они должны были бы соответствовать одним и тем же позициям, поскольку они объявлены как route.send(‘actionName’, ‘args1’, ‘args2’).

В нашем втором тесте мы используем шпионскую функцию sinon, чтобы убедиться, что наше действие linkTo было вызвано и внутри него было вызвано transitionTo один раз и с определенным набором аргументов, в данном случае это просто строка route-name.

Вот как вы начинаете модульное тестирование в Ember! Это очень простой учебник, но вы можете расширить его и провести гораздо более сложное тестирование, когда полностью его поймете! Sinon — отличный инструмент для проверки того, была ли вызвана функция или нет и с какими аргументами. Я использовал его намного позже, и я призываю вас всех проверить его и включить в следующий раз, когда вы будете писать свои тесты!