Асинхронное свойство инициализатора Ember не определено в интеграционном тесте

Я пытаюсь протестировать свои процессы регистрации и входа в систему, интеграционные тесты прошли отлично до создания инициализатора для расширения объекта сеанса Ember-Simple-Auth с помощью свойства currentUser.

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

this.get('session.currentUser').then(function(user) {

with : TypeError: Невозможно прочитать свойство 'then' неопределенного


/routes/application.js

import Ember from 'ember';
import ApplicationRouteMixin from 'simple-auth/mixins/application-route-mixin';

export default Ember.Route.extend(ApplicationRouteMixin, {
  actions: {
    sessionAuthenticationSucceeded: function () {
      var self = this;
      this.get('session.currentUser').then(function(user) {
          if (user.get('account') && user.get('status') === 'complete'){
            self.transtionTo('home');
          } else {
            console.log('Need to complete Registration');
            self.transitionTo('me');
          }
      });
    }
  }
}

/initializers/custom-session.js

import Ember from 'ember';
import Session from 'simple-auth/session';

export default {
  name: 'custom-session',
  before: 'simple-auth',
  initialize: function(container) {
    // application.deferReadiness();
    Session.reopen({
      currentUser: function() {
        var id = this.get('user_id');
        if (!Ember.isEmpty(id)) {
          console.log('getting the current user');
          return container.lookup('store:main').find('user', id);
        }
      }.property('user_id')
    });
    // application.advanceReadiness();
  }
};

/tests/integration/visitor-signs-up-test.js

test('As a user with valid email and password', function(){
  var email = faker.internet.email();
  signUpUser(email, 'correctpassword', 'correctpassword');
  andThen(function(){
    equal(find('#logged-in-user').text(), email, 'User registered successfully as ' + email);
    equal(sessionIsAuthenticated(App), true, 'The session is Authenticated');
  });
});

test/helpers/registration-login.js

export function signUpUser(email, password, passwordConfirmation) {
  visit('/register').then(function(){
    fillIn('input.email', email);
    fillIn('input.password', password);
    fillIn('input.password-confirmation', passwordConfirmation);
    click('button.submit');
  });
}

я пытался использовать

application.deferReadiness()

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

Я использую Pretender для перехвата запросов API, но вызов api/v1/users/:id вообще не выполняется во время испытаний.

Странно то, что он отлично работает в браузере.

Я пытаюсь понять, почему это не сработает? Любое руководство будет оценено!

NB: я также пробовал решение, указанное здесь и здесь с тем же результатом, что и выше.


person Obi    schedule 12.11.2014    source источник


Ответы (1)


Я понял проблему, оказалось, что я не возвращал user_id из запроса api/v1/users/sign_in, который перехватывал Pretender, поэтому, когда sessionAuthenticationSucceeded срабатывал, user_id не было доступно, и поэтому currentUser никогда не обновлялся/не запускался.

Я оставлю весь код там на случай, если он поможет кому-то еще. Комментарии или улучшения к нему по-прежнему очень приветствуются!

person Obi    schedule 13.11.2014