簡體   English   中英

集成測試中未定義的Ember初始化器異步屬性

[英]Ember initializer async property undefined in integration test

我正在嘗試測試我的注冊和登錄過程,在創建初始化程序以使用currentUser屬性擴展Ember-Simple-Auth Session對象之前,集成測試已完全通過。

一切都可以在瀏覽器中正常運行,只是測試現在在以下行的應用程序路由的sessionAuthenticationSucceeded操作中全部失敗:

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

與: 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');
  });
});

測試/助手/注冊-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進行調用。

奇怪的是它在瀏覽器中完美地工作。

我試圖了解為什么這行不通? 任何指導將不勝感激!

注意:我也嘗試過此處此處列出的解決方案,其結果與上述相同。

我已經解決了這個問題,原來我不是從api/v1/users/sign_in請求中返回一個user_id ,但api/v1/users/sign_in正在攔截,因此當sessionAuthenticationSucceeded觸發時,沒有user_id可用,因此currentUser不會被更新/觸發。

我將所有代碼保留在那里,以防其他人使用。 仍然非常歡迎對其進行評論或改進!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM