Вот низкоуровневый способ сделать это с жасмином, протестировав, что pushState работает, как ожидается, и что ваш маршрутизатор настроил все правильно ...
Я предполагаю, что router
был инициализирован и имеет маршрут home , сопоставленный с ''. Вы можете адаптировать это для других ваших маршрутов. Я также предполагаю, что вы сделали в вашем приложении инициализацию 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();
...
});
});
Вы можете эффективно достичь подобных результатов, выполнив Backbone.history.stop();
по этой причине.
ОБНОВЛЕНИЕ: Браузеры без pushState
:
Это, конечно, будет хорошо работать, если ваш браузер, на котором вы тестируете, поддерживает pushState
. Если вы тестируете браузеры, которые этого не делают, вы можете выполнить следующие условия:
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();
}
});
Если вы используете IE6, удачи.