Ember - Gib ein Versprechen von beforeModel zurück, das nicht mit Qunit zusammenarbeitet

In meinemApplicationRoute Ich implementiere einebeforeModel Hook, der einen Serveraufruf ausführt, um festzustellen, ob eine gültige Sitzung vorhanden ist. Wenn dies der Fall ist, navigiert die App zur 'Dashboard'-Route, andernfalls zur' Login'-Route. Ich versuche, einige Tests zu implementieren, und es scheint, dass ich es nicht mit QUnit zum Laufen bringen kann. Ich bekomme immer:

Behauptung fehlgeschlagen: Sie haben den Testmodus aktiviert, wodurch die automatische Ausführung des Run-Loops deaktiviert wurde. Sie müssen jeden Code mit asynchronen Nebenwirkungen in eine Ember.run-Datei einbinden

Hier ist ein Plunkerhttp://plnkr.co/edit/e0Q4qz?p=preview Ich habe einen Serveraufruf durch Erstellen eines simuliertdoLater Methode, die ein Versprechen zurückgibt und eine Methode in wenigen Millisekunden ausführt. Der einzige Weg, wie ich es zum Laufen bringen kann, besteht darin, kein Versprechen von derbeforeModel Haken. Verwende ichApp.deferReadiness() undEmber.run() korrekt?

App = Ember.Application.create({});

App.Router.map(function() {
  this.resource('dashboard');
  this.resource('login');
});

App.ApplicationRoute = Ember.Route.extend({
  alreadyChecked: false,

  beforeModel: function() {
    var route = this;

    // uncomment this line to stop this hook returning a promise
    // return route.transitionTo(localStorage.user ? 'dashboard' : 'login');

    if (!this.alreadyChecked) {
      return doLater(function() {
        // without the alreadyChecked flag, this function gets called twice
        route.set('alreadyChecked', false);
        route.transitionTo(localStorage.user ? 'dashboard' : 'login');
      });
    }
  }
});

App.LoginRoute = Ember.Route.extend({
  actions: {
    login: function() {
      var route = this;
      doLater(function() {
        localStorage.user = "Bill";
        route.transitionTo('dashboard');
      });
    }
  }
});

App.DashboardRoute = Ember.Route.extend({
  actions: {
    logout: function() {
      var route = this;
      doLater(function() {
        localStorage.user = "";
        route.transitionTo('login');
      });
    }
  }
});

function doLater(fn) {
  return Ember.RSVP.Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve(fn());
    }, 500);
  });
}


// run the tests
if (true) { // toggle this boolean to run the app in testing mode
  App.rootElement = '#ember-testing';
  App.setupForTesting();
  App.injectTestHelpers();

  module('integration tests', {
    setup: function() {
      Ember.run(function() {
        App.reset();
        localStorage.user = "";
        App.deferReadiness();
      });
    }
  });

  test('can navigate to login page', function() {
    expect(1);
    Ember.run(App, 'advanceReadiness');
    visit("/login").then(function() {
      ok(true, "Tests work");
    });
  });
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage