用 Mocha、Chai、Sinon 模拟和测试按键事件?

Simulate and test a keypress event with Mocha, Chai, Sinon?

我有一个 Backbone 视图,其中包含 keyupkeydown 事件的自定义事件。

events: {
    "keyup .search-box": "changeTextTimer",
    "keydown .search-box": "cancelTextTimer"
},

我正在编写单元测试来检查这些回调是否在 keyup 或 keydown 之后被调用。我用jQuery触发按键事件

it("should call cancelTextTimer", function() {
    var searchBox = new SearchBoxView({el: $(HTML),}).render();

    var e = $.Event("keydown");
    e.which = 65;
    searchBox.$(".search-box").trigger(e);

    var changeTextTimer = sinon.spy(searchBox, "cancelTextTimer");
    _.defer(changeTextTimer.restore);

    changeTextTimer.should.have.been.calledOnce;

});

但是,我收到了

AssertionError: expected cancelTextTimer to have been called exactly once, but 
it was called 0 times: Got value cancelTextTimer but expected a value undefined undefined

试试这个

it("should call cancelTextTimer", function(done) {
    var searchBox = new SearchBoxView({el: $(HTML),}).render();
    var changeTextTimer = sinon.spy(searchBox, "cancelTextTimer");
    _.defer(changeTextTimer.restore);

    var e = $.Event("keydown");
    e.which = 65;
    searchBox.$(".search-box").trigger(e);

    setTimeout(() => {
        changeTextTimer.should.have.been.calledOnce;
        done();
    }, 0);

});