Ember - Zwróć obietnicę z poprzedniej wersjiModel nie działa z Qunit
W moimApplicationRoute
WdrażambeforeModel
hook, który wykonuje wywołanie serwera, aby sprawdzić, czy istnieje ważna sesja. Jeśli tak, aplikacja przechodzi do trasy „deski rozdzielczej”, w przeciwnym razie przechodzi do trasy „logowania”. Próbuję zaimplementować niektóre testy i nie mogę sprawić, aby działało ono z QUnit. Ciągle otrzymuję:
Asercja nie powiodła się: włączyłeś tryb testowania, który wyłączył automatyczne uruchamianie pętli uruchomieniowej. Będziesz musiał owinąć dowolny kod asynchronicznymi efektami ubocznymi w Ember.run
Oto pogromcahttp://plnkr.co/edit/e0Q4qz?p=preview Symulowałem wywołanie serwera, tworzącdoLater
metoda, która zwraca obietnicę i wykonuje metodę w ciągu kilku milisekund. Jedynym sposobem, w jaki mogę go uruchomić, jest nie zwracanie obietnicy odbeforeModel
hak. Czy używamApp.deferReadiness()
iEmber.run()
poprawnie?
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");
});
});
}