これはジャスミンでそれを行う低レベルの方法であり、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 を使用している場合は、頑張ってください。