Ето един нисък начин да го направите с жасмин, като тествате дали pushState работи според очакванията и дали вашият рутер настройва нещата правилно... Предполагам, че router
е инициализиран и има картографиран домашен маршрут да се ''. Можете да адаптирате това за другите си маршрути. Предполагам също, че сте направили в инициализацията на приложението си 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, успех.
person
ggozad
schedule
14.02.2012