【问题标题】:How am I able to test that a Backbone model's method bound to the event bus has fired when using Karma and Sinon?使用 Karma 和 Sinon 时,如何测试绑定到事件总线的 Backbone 模型的方法是否已触发?
【发布时间】:2017-10-16 06:46:45
【问题描述】:

当使用 sinon spy 测试主干模型的事件时,它会错误地出错:expected doSomething to be called once but was called 0 times,尽管它似乎在将控制台日志放入方法体时执行。测试函数如下:

it('Y U NO WORK', function() {
    const events = {};
    _.extend(events, Backbone.Events);
    const Model = Backbone.Model.extend({
        initialize: function() {
            this.listenTo(events, 'doSomething', this.doSomething);
        },
        doSomething: function() {},
    });
    const model = new Model();
    const spy = sinon.spy(model, 'doSomething');
    events.trigger('doSomething');
    sinon.assert.calledOnce(spy);
});

我知道要修复,您必须将 sinon spy 放在模型的原型上,例如 const spy = sinon.spy(Model.prototype, 'doSomething');new Model() 调用之前的行中,但是在放入模型实例时它似乎可以正常工作,如下:

it('And this does work', function() {
    const Model = Backbone.Model.extend();
    const model = new Model();
    const spy = sinon.spy(model, 'set');
    model.set('foo', 'bar');
    sinon.assert.calledOnce(spy);
});

很好奇为什么它需要在第一个实例中放在模型的原型上,但在第二个实例中可以在模型实例上工作?

【问题讨论】:

    标签: backbone.js karma-runner sinon backbone-events sinon-chai


    【解决方案1】:

    Spy 将原始方法替换为自定义方法,以了解何时调用它(它保存对原始方法的引用,以便稍后恢复)。因此,在第一种情况下,您在创建间谍之前设置了一个事件侦听器。事件系统实际上是直接引用原始方法,而不是间谍。 Spy 对此无能为力,Spy 不知道它何时被调用。

    在设置事件监听器之前,你需要先设置 spy,比如:

    it('Y U NO WORK', function() {
        var spy;
        const events = {};
        _.extend(events, Backbone.Events);
        const Model = Backbone.Model.extend({
            initialize: function() {
                spy = sinon.spy(this, 'doSomething');
                this.listenTo(events, 'doSomething', this.doSomething);
                //now same as this.listenTo(events, 'doSomething', spy);
            },
            doSomething: function() {},
        });
        const model = new Model();
        events.trigger('doSomething');
        sinon.assert.calledOnce(spy);
    });
    

    或者避免直接引用原始方法,例如:

    this.listenTo(events, 'doSomething', function() {
      //by the time this is invoked, original has been replaced with spy
      this.doSomething();
    });
    

    它可以工作,因为它没有引用原始方法,方法调用是动态的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 2012-06-07
      • 2012-02-11
      • 2023-03-22
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      相关资源
      最近更新 更多