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");
});
});
}