使用Jasmine监视事件回调

时间:2014-01-21 19:08:31

标签: javascript backbone.js requirejs closures jasmine

我正在使用Jasmine来测试Require.js模块中的Backbone.js视图。

如果我没有在匿名函数中包装回调,为什么我的测试会失败?

以下是测试:

describe("view extension", function () {
    // extendedView is an instance of ExtendedView()
    spyOn(extendedView, 'onOpen');

    // open the element, which should trigger an event
    extendedView.open();

    expect(extendedView.onOpen).toBeDefined();
    expect(extendedView.onOpen).toHaveBeenCalled();
});

出现故障:

var BaseView = Backbone.View.extend({
    open: function () {
        this.trigger('open');
    }
});

var ExtendedView = BaseView.extend({
    initialize: function () {
        var self = this;
        self.on('open', self.onOpen);
    },
    onOpen: function() {
        console.log('I heard myself open');
    }
});

.initialize()中传递以下修订版:

    self.on('open', function () { self.onOpen() });

1 个答案:

答案 0 :(得分:1)

它无法正常工作的原因是您正在实例上安装间谍,并在绑定事件处理程序后执行此操作。事件的顺序大致如下:

  1. 将创建将分配给extendedView的实例,以便ExtendedView' initialize方法执行self.on('open', self.onOpen);当时 self.onOpen评估ExtendedView类定义的原始函数。

  2. 然后在extendedView.onOpen上设置间谍。这会将onOpen的{​​{1}}(以及extendedView)的值更改为新间谍的值。

  3. extendedView被调用。由于extendedView.open()最初是为self.on类设置self.onOpen的值而调用的,因此原始函数被称为现在驻留在ExtendedView的间谍。

  4. 使用匿名函数时它起作用的原因是,只要extendedView.onOpen事件发生,匿名函数就会获得self.onOpen的值,这在测试中意味着获得此值之后你已经设置了间谍。

    您必须监视类方法而不是实例。类似的东西:

    open