Voici un bas-levelish moyen de le faire avec du jasmin, de l'essai que pushState fonctionne comme prévu et que votre routeur met en place les choses correctement...
Je suppose un router
qui a été initialisé et a une maison de l'itinéraire tracé à l' ". Vous pouvez adapter ce pour votre d'autres voies. J'ai aussi supposer que vous avez fait dans votre application phase d'initialisation, une Backbone.history.start({ pushState: true });
describe('app.Router', function () {
var router = app.router, pushStateSpy;
it('has a "home" route', function () {
expect(router.routes['']).toEqual('home');
});
it('triggers the "home" route', function () {
var home = spyOn(router, 'home').andCallThrough();
pushStateSpy = spyOn(window.history, 'pushState').andCallFake(function (data, title, url) {
expect(url).toEqual('/');
router.home();
});
router.navigate('');
expect(pushStateSpy).toHaveBeenCalled();
expect(home).toHaveBeenCalled();
...
});
});
Vous pouvez effectivement obtenir les mêmes choses en faisant Backbone.history.stop();
il est fait pour cette raison.
Mise à JOUR: les Navigateurs sans pushState
:
Bien sûr, cela fonctionnera bien si votre navigateur vous le tester sur supporte pushState
. Si vous testez contre les navigateurs qui ne le font pas, vous pouvez conditionnellement test comme suit:
it('triggers the "home" route', function () {
var home = spyOn(router, 'home').andCallThrough();
if (Backbone.history._hasPushState) {
pushStateSpy = spyOn(window.history, 'pushState').andCallFake(function (data, title, url) {
expect(url).toEqual('/');
router.home();
});
router.navigate('', {trigger: true});
expect(pushStateSpy).toHaveBeenCalled();
expect(home).toHaveBeenCalled();
} else if (Backbone.history._wantsHashChange) {
var updateHashSpy = spyOn(Backbone.history, '_updateHash').andCallFake(function (loc, frag) {
expect(frag).toEqual('');
router.home();
});
router.navigate('', {trigger: true});
expect(updateHashSpy).toHaveBeenCalled();
expect(home).toHaveBeenCalled();
}
});
Si vous êtes sur IE6, bonne chance.