【问题标题】:Unit testing Backbone.Marionette listeners单元测试 Backbone.Marionette 监听器
【发布时间】:2014-09-11 07:11:34
【问题描述】:

我想检查我的 Marionette 组件(例如控制器)附加了哪些侦听器:

组件示例代码:

var MyController =  Marionette.Controller.extend({
    initialize: function () {

        this.listenTo(OtherModule, "start", function () {
            // something happens here
        });
        this.listenTo(OtherModule, "stop", function () {
            // something happens here
        });

    })
});

var myController = new MyController();

单元测试示例代码:

describe("MyController", function () {
    it("should have 2 listeners registered", function () {
        // ?
    });
});

我可以触发事件,看看我想使用的函数是否使用 jasmine 的 spyOn 方法执行,但我很好奇是否有直接在组件上可用的附加事件列表。

如何检查我的组件在听什么?

【问题讨论】:

    标签: javascript unit-testing backbone.js jasmine marionette


    【解决方案1】:

    我认为您以错误的方式进行单元测试 - unit tests should check that your object interacts with the outside world in the expected way. They shouldn't be concerned with implementation details(就像对象拥有的事件侦听器的确切数量一样)。

    话虽如此,您可以使用_listeners(Backbone 1.0.x)或_listeningTo(Backbone 1.1.x)属性:

    var controller = new MyController;
    
    describe("MyController", function () {
        it("should have 2 listeners registered", function () {
            expect(Object.keys(controller._listeners).length).toEqual(2)
        });
    });
    

    Source - Marionette.Controller 扩展了 Backbone.Eventsstores listeners 在该属性中。

    我不会在单元测试中使用这种方法,但它对于调试内存泄漏非常有用。

    【讨论】:

    • 谢谢,非常有用。我想测试实现细节以仔细检查我注册的事件处理程序是否具有正确的名称。我发现自己在代码重构后出现了事件名称更改的错误,我相信这样的测试会提醒我再次检查名称。我很高兴找到更好的方法,你以前遇到过类似的事情吗?
    【解决方案2】:

    当我想调试这种东西时,我经常使用 window.MyController = MyController。然后在控制台中我可以保存 window.MyController 并使用它。

    看起来它会显示它正在监听的对象,但我不一定会看到它以这种方式与哪些事件相关联。反正可以看看看看。我也在使用 Chrome,所以 Mozilla 中的 Firebug 可能会提供更好的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-09
      • 2016-06-12
      • 2019-07-18
      • 2014-05-12
      • 1970-01-01
      • 2013-09-25
      • 2015-10-14
      • 2018-06-13
      相关资源
      最近更新 更多