刺探Backbone.js的路线茉莉调用(Spying on Backbone.js route c

2019-07-30 20:39发布

拥有的骨干路由器刺探方法调用的问题,以确保它卡列斯某一特定航线上的正确的方法。

从测试摘录

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()

Answer 1:

它已经花了太多的时间给我配备了工作的jsfiddle和问题已经@MarkRushakoff被已经回答了。

不过我有一些意见。

该办法骨干,是结合路由使得很难对其进行测试。

的一点是,路由器方法并不在路由器实例直接调用,这些方法如抽放回调和存储在内部Backbone.history.route等待执行, 检查Backbone.Router.route代码 。

此操作在瞬间完成Router是实例化,所以你要spy你的Router.method您实例引用之前,所以你不得不推迟Backbone.history.start也在之后spy已被激活。

正如你必须申报spy创建路由器实例之前,你必须做一个一流水平。

这么说,这是我想出了最简单的解决方案:

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实施还没有一个直观的设计。



Answer 2:

我敢肯定,这与当使用哈希航线(特别是如果你看到一个控制台日志输出正确),其骨干结合自己的路由方法的方式做。 也就是说,路由器已经绑定到原来的index方法,但你的间谍已经取代了“当前” index法。

你有两个选择:

  • spyOn(@router, "index")在你们以前的路由器结合路线(可能是困难的)
  • 在原型的Spy index方法: spyOn(App.router.prototype, "index"); @router.navigate('', true); expect(App.router.prototype.index).toHaveBeenCalled(); spyOn(App.router.prototype, "index"); @router.navigate('', true); expect(App.router.prototype.index).toHaveBeenCalled();


文章来源: Spying on Backbone.js route calls with Jasmine