Внедрение сервиса в тесты Ember

Я прочитал и следил за EmberJS Service Injection для модульных тестов (Ember QUnit) но я до сих пор не могу понять, в чем проблема.

Я хотел бы проверить, работает ли моя аутентификация должным образом. Я написал аутентификатор для ember-simple-auth, и сеанс вводится в маршрут. Сам код работает без проблем.

export default Ember.Route.extend({
  authManager: Ember.inject.service('session'),
  ...
  (in actions):
    this.get('authManager').invalidate()

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

moduleFor('route:index', 'Unit | Route | xyz', {
  needs: ['service:session']
});

test('2', function(assert) {
  let route = this.subject();
  let s = route.get('authManager');

Когда я печатаю содержимое 's', я получаю ''. Если я изменю это на что-то другое, то ответ будет неопределенным, как и следовало ожидать. Проблема в том, что я хочу получить свойство isAuthenticated или запустить invalidate(). В этих случаях я получил «неопределенный». Что я делаю не так?


person Marek Grác    schedule 19.05.2016    source источник
comment
Я предполагаю, что вам нужно использовать интеграционные тесты для таких целей. Если вы хотите написать модульные тесты, вам нужно имитировать все, кроме самого тестируемого объекта (в данном случае маршрут индекса). У меня была аналогичная проблема с сервисами тестирования: > stackoverflow.com/questions/37190648/   -  person Pavol    schedule 19.05.2016


Ответы (2)


Начиная с Ember 2.13 правильным решением является использование this.register:

test('my test', function(assert) {
  this.register('service:session', Ember.Service.extend({
    /* mock code */
  }));

  let subject = this.subject();

  // test code goes here...
}
person Jouke van der Maas    schedule 12.05.2017

В модульном тесте мы предпочитаем использовать фиктивные объекты вместо сервисов. В интеграционных тестах мы можем использовать настоящие сервисы вместо макетов.

Чтобы смоделировать службу, в модульном тесте:

var stubMyService = Ember.Object.extend({
    //This is a mock object, write a code to test component/route!
    invalidate: function() {
        return 'invalidateCalled';
    },
    isAuthenticated: function(){
       return true;
    }
});

Чтобы внедрить этот фиктивный объект в ваш компонент/маршрут, используйте создание this.subject() следующим образом:

test('2', function(assert){
    var component = this.subject({
        authManager: stubMyService.create()
    });
    ...
});
person ykaragol    schedule 20.05.2016
comment
Спасибо за ответ, скорее всего я не совсем ясно выразился. Я хочу протестировать внедрённый сервис. Коммуникация этого сервиса имитируется ember-mirage, поэтому других зависимостей нет. Это причины, по которым мокап-сервис мне не поможет. Я знаю, что могу создать маршрут и использовать приемочный тест, не беспокоясь о таких проблемах, но я хотел бы знать. - person Marek Grác; 20.05.2016
comment
Спасибо за ответ. Это также сработало для меня в модульном тесте для службы (в моем случае служба внедрила службу!) - person morhook; 25.01.2017
comment
Это больше не работает с Ember 2.13, см. этот RFC: github.com/emberjs/rfcs/blob/master/text/0150-factory-for.md - person Jouke van der Maas; 12.05.2017