Ember - Retorna uma promessa de beforeModel não funciona com Qunit
No meuApplicationRoute
Eu implementar umbeforeModel
gancho que faz uma chamada de servidor para ver se existe uma sessão válida. Em caso afirmativo, o aplicativo navega para a rota "dashboard", caso contrário, ele vai para a rota "login". Eu estou tentando implementar alguns testes e não consigo fazê-lo funcionar com o QUnit. Eu continuo recebendo:
Assertion failed: Você ativou o modo de teste, o que desativou a execução automática do loop de execução. Você precisará agrupar qualquer código com efeitos colaterais assíncronos em um Ember.run
Aqui é um plunkerhttp://plnkr.co/edit/e0Q4qz?p=preview Eu simulei uma chamada de servidor criando umdoLater
método que retorna uma promessa e executa um método em alguns milissegundos. A única maneira de fazer isso funcionar é não retornar uma promessa dobeforeModel
gancho. Estou usandoApp.deferReadiness()
eEmber.run()
corretamente?
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");
});
});
}