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

前端之家收集整理的这篇文章主要介绍了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的实现还没有一个直观的设计.

猜你在找的JavaScript相关文章