Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 摧毁主干。路由器和创建后的所有副作用_Javascript_Backbone.js_Browser History - Fatal编程技术网

Javascript 摧毁主干。路由器和创建后的所有副作用

Javascript 摧毁主干。路由器和创建后的所有副作用,javascript,backbone.js,browser-history,Javascript,Backbone.js,Browser History,假设您希望能够创建一个调用Backbone.history.start的Backbone.Router实例,销毁它的所有痕迹,然后再次创建它 我需要为单元测试做这个 问题在于,创建主干路由器具有全球意义。比如Backbone.history,在你完成之前是不可定义的 var ReversibleRouter = Backbone.Router.extend({ initialize: function(){ _buildAppPaths(this.options) // Implem

假设您希望能够创建一个调用Backbone.history.start的Backbone.Router实例,销毁它的所有痕迹,然后再次创建它

我需要为单元测试做这个

问题在于,创建主干路由器具有全球意义。比如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

这可能是欺骗,但我认为您应该模拟功能单元之外的函数,即您的测试,并特别确保不允许您的单元测试触及活动DOM,服务器或浏览器

看看吧,这很好

下面是一个在不影响浏览器历史状态的情况下测试路由器初始化方法的示例

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);
});
在这种方法下,您已经成功地断言所有调用都是对外部功能单元(包括参数)进行的。在这一点上,您可以相信外部调用将完成它的工作(通过额外的单元测试进行验证)


要在此单元之外进行调用,需要执行集成测试,而不是单元测试。

如果您希望执行更多完整堆栈集成类型的测试,可以使用以下命令重置应用程序的路由器:

Backbone.history.stop()
Backbone.history = undefined // Could also probably use delete here :)
到目前为止,这是成功的——我们的测试可能会在qunit测试期间实例化并杀死路由器5次。效果很好


也许像@AdamTerlson所说的嘲弄是更好的长期发展方式,但我仍然在学习单元测试和集成测试哲学。不过,我不介意进行一两次完整的堆栈测试。

我已经使用
Backbone.history.stop()
Backbone.history=undefined
实现了它,到目前为止没有任何负面影响,但我感到不安。显然,对单元测试很有用:“在真正的应用程序中不有用,但可能对路由器的单元测试有用。”很好的发现,@muistooshort。谢谢谢谢你!知道为什么主干文档中没有引用
history.stop