Не удается отправить действие от контроллера на маршрут в модульном тесте - PullRequest
0 голосов
/ 08 октября 2018

В моем модульном тесте я вызываю действие в моем контроллере, который, в свою очередь, отправляет действие на маршрут:

this.send('setRandomPage', this._generateRandomPage(this.get('count')));

И в этой строке оно разрывается с:

TypeError: Cannot read property 'trigger' of undefined
    at Class.send 

Есть ли способ переопределить метод send с помощью Sinon, чтобы он проходил?this указывает правильно на мой контроллер.

1 Ответ

0 голосов
/ 10 октября 2018

Я бы порекомендовал издеваться над свойством target вашего Controller.Если запущено действие, которого нет на вашем контроллере, оно всплывает до target.В случае контроллера это соответствующий маршрут.Как обычно, вы можете передать макет тестируемой конструкции на this.subject().Вы можете достичь того же, что и при использовании Sinon, но без введения другой зависимости и с хорошо читаемым кодом.

Предположим, у нас есть такой контроллер:

export default Controller.extend({
  actions: {
    sendActionToRoute() {
      this.send('actionOnRoute');
    }
  }
});

Мы можем выполнить модульное тестирование sendActionToRoute вот так:

test('it sends an action to route', function(assert) {
  let controller = this.subject({
    target: {
      send(action) {
        assert.step('send method of route');
        assert.equal(action, 'actionOnRoute', 'correct action is triggered on route');
      }
    }
  });
  controller.send('sendActionToRoute');
  assert.verifySteps(['send method of route']);
});

Пожалуйста, найдите тлеющий уголь, демонстрирующий этот подход: https://ember -twiddle.com / dd417cf8757607cdd669448c42ce7bbc? NumColumns = 2 & openFiles = controllers.my-controller.js% 2Ccont.my-controller.js

...