JavaScript – 间谍在Backbone.js路由电话与茉莉花

在骨干路由器上发现问题侦查方法调用,以确保在给定路由上调用正确的方法.

摘自测试

describe 'Router',->
    beforeEach ->
        @router = new App.Router()
        Backbone.history.start()

    afterEach ->
        Backbone.history.stop()

    describe 'routes',->
         it 'should be defined',->
              expect(@router.routes).toBeDefined()

         describe 'default route',->
             it 'should be defined',->
                  expect(@router.routes['']).toBeDefined()

             it 'should call index',->
                 spy = spyOn(@router,"index")
                 @router.navigate('',true)
                 expect(spy).toHaveBeenCalled()

路由器

class App.Router extends Backbone.Router
    routes:
        '' : 'index'

    index: ->
        console.log "router.index has been called"

一切都通过,除了最后一个测试“应该调用索引”.
它失败,并显示消息“预期的间谍索引已被调用”.
我试过其他变种

it "should call index",->
    spyOn(@router,"index")
    @router.navigate('',true)
    expect(@router.index).toHaveBeenCalled()

我也可以从原来的Router.index函数中看到“router.index已被调用”的日志输出在测试输出

谢谢!

编辑:
一个解决方

describe '#1 Solution',->
    it 'should call index',->
        spyOn(App.Router.prototype,"index")
        @router = new App.Router()
        Backbone.history.start()
        @router.navigate('',true)
        expect(App.Router.prototype.index).toHaveBeenCalled()

解决方法

我花了太多时间来搭配 working jsFiddle,而且这个问题已经被@MarkRushakoff回答了.

仍然有一些意见.

Backbone绑定路由的方式非常难以测试.

关键是路由器方法不直接在路由器实例中调用,这些方法被称为回调,并存储在等待执行的内部Backbone.history.route check the Backbone.Router.route code中.

此操作在路由器实例化的时刻完成,因此您必须在实例化引用之前监视您的Router.method,因此您必须在Spy已激活后延迟Backbone.history.start.

因为您必须在创建路由器实例之前声明间谍,您必须在类级别中执行此操作.

说这是我最简单的解决方案:

describe("Router",function() {
  afterEach( function(){
    Backbone.history.stop();
  });

  it("should call index",function(){
    spyOn(App.Router.prototype,"index")
    var router = new App.Router(); // instance created after spy activation
    Backbone.history.start();      // it has to start after the Router instance is created

    router.navigate('',true);

    expect(App.Router.prototype.index).toHaveBeenCalled();  
  });
});

结论,我认为Backbone.Router的实现还没有一个直观的设计.

相关文章

事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三个参数...
js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言...
什么是跨域 跨域 : 广义的跨域包含一下内容 : 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源...
@ "TOC" 常见对base64的认知(不完全正确) 首先对base64常见的认知,也是须知的必须有...
搞懂:MVVM模式和Vue中的MVVM模式 MVVM MVVM : 的缩写,说都能直接说出来 :模型, :视图, :视图模...
首先我们需要一个html代码的框架如下: 我们的目的是实现ul中的内容进行横向的一点一点滚动。ul中的内容...