我正在关注此question来测试路由器。我的路由器非常简单:
App.Router = Backbone.Router.extend({
routes:{
"": "index",
"help": "help"
},
help: function() {/* not really needed */ },
index: function(){
// does something
}
});
这是对使用茉莉花与sinon的测试应该是什么的试图翻译:
it('triggers the "index" route', function() {
var router = new App.Router();
Backbone.history.start();
//Not calling navigate it's a problem
router.navigate('help', {
trigger : true, replace: true
});
var index = sinon.spy(router, 'index');
var spyHasPS = sinon.spy(function(
data, title, url) {
expect(url).toEqual('/');
router.index();
});
var spyNoPS = sinon.spy(function(loc, frag) {
expect(frag).toEqual('');
router.index();
});
if (Backbone.history._hasPushState) {
pushStateSpy = sinon.stub(window.history, 'pushState', spyHasPS );
// window.history.pushState();
} else if (Backbone.history._wantsHashChange) {
pushStateSpy = sinon.stub(Backbone.history, '_updateHash', spyNoPS);
//Backbone.history._updateHash(window.location, '');
}
router.navigate('', {
trigger : true, replace: true
});
expect(pushStateSpy.called).toBe(true);
expect(index.called).toBe(true);
});
这个测试有效,但我可以实现它,因为我首先导航了“帮助”。 “帮助”只是我创建的通过测试的东西,但原始问题没有做到并且正在通过。我做错什么了吗?我也参加了测试,但我得到的错误是:
Expected spy _updateHash to have been called. Error: Expected spy
_updateHash to have been called.
at null.<anonymous> (/src/test/js/spec/wfcRouter.spec.js:65:32) Expected spy index to have been called.
我认为“问题”在导航功能中。在navigate: function(fragment, options)
中的某个点我们有这个控件:
fragment = this.getFragment(fragment || '');
if (this.fragment === fragment) return;
所以...当你只有一条路线时测试pushState是否有意义(记得我添加了“帮助”只是为了让这个测试通过所以我不需要它)?如果确实有意义,我该如何实现这个测试呢?
答案 0 :(得分:0)
看起来你正在测试的是Backbone代码,但你没有必要对它进行测试:大概是Backbone代码已经过Jeremy Ashkenas的大量测试(如果你看看GitHub上的Backbone项目,你会看到他确实有一个全面的测试套件)。因此,您不应该重新测试代码,而不是编写已经过测试的代码,而您应该测试的是您编写的代码。
如果您同意这一原则,那么您可以大大简化测试,直至:
it('triggers the "index" route', function() {
var router = new App.Router();
router.index();
expect(thingThatShouldHaveHappenedInIndexRouteDidHappen).toBe(true);
});