假设您希望能够创建一个调用Backbone.history.start的Backbone.Router实例,销毁它的所有痕迹,并再次创建它。
我需要进行单元测试。
问题是创建一个Backbone路由器具有全局意义。就像Backbone.history一样,在你创建它之前是未定义的。
var ReversibleRouter = Backbone.Router.extend({
initialize: function(){
_buildAppPaths(this.options) // Implementation not shown. Builds the application paths
Backbone.history.start()
},
destroy: function(){
// TODO: Implement this
}
})
我希望能够创建并完全销毁,以便我可以对我的应用程序的路由器实现进行单元测试。
足以拨打Backbone.history.stop()
并设置Backbone.history = undefined
?
答案 0 :(得分:1)
如果您希望进行更多完整堆栈集成类型的测试,可以使用以下命令重置应用程序的路由器:
Backbone.history.stop()
Backbone.history = undefined // Could also probably use delete here :)
到目前为止这已经成功 - 我们的测试可能会在我们的qunit测试期间实例化并杀死路由器5次。效果很好。
也许像@AdamTerlson这样的嘲讽说是长期更好的方式,但我仍然在学习单元和集成测试理念。不过,我不介意进行一两次完整的测试。
答案 1 :(得分:0)
这可能是作弊,但我认为你应该嘲笑你的功能单元之外的功能,你的测试并特别确定你的单元测试不允许点击实时DOM,服务器或浏览器
查看SinonJS,这对此很有帮助。
这是一个测试路由器初始化方法而不会影响浏览器历史状态的示例。
test('...', function () {
// Arrange
var buildAppPaths = sinon.stub(ReversibleRouter.prototype, '_buildAppPaths');
var startHistory = sinon.stub(Backbone.history, 'start');
var options = {};
// Act
new ReversibleRouter(options);
// Assert
ok(buildAppPaths.calledWith(options));
ok(startHistory.calledOnce); // or ok(Backbone.history.start.calledOnce);
});
根据这种方法,您已成功断言所有调用都是对外部功能单元进行的,包括params。此时,您可以相信外部调用将完成其工作(通过其他单元测试证明)。
要在此单元之外拨打电话,请执行集成测试,而不是进行单元测试。