Разочарование модульного тестирования QUnit, Sinon.js и Backbone: sinon spy, похоже, не может обнаружить обратные вызовы событий модели Backbone

В следующем коде модульного теста:

TestModel = Backbone.Model.extend({
    defaults: {
        'selection': null
    },
    initialize: function() {
      this.on('change:selection', this.doSomething);
    },
    doSomething: function() {
        console.log("Something has been done.");
    }
});

module("Test", {
    setup: function() {
        this.testModel = new TestModel();
    }
});

test("intra-model event bindings", function() {
    this.spy(this.testModel, 'doSomething');
    ok(!this.testModel.doSomething.called);
    this.testModel.doSomething();
    ok(this.testModel.doSomething.calledOnce);
    this.testModel.set('selection','something new');
    ok(this.testModel.doSomething.calledTwice); //this test should past, but fails.  Console shows two "Something has been done" logs.
});

Третий ok завершается с ошибкой, даже несмотря на то, что функция была фактически вызвана из привязки события магистрали, как показано в консоли.

3rd test fails enter image description here

Это очень расстраивает и поколебало мою уверенность в том, подходит ли sinon.js для тестирования моего магистрального приложения. Я делаю что-то не так, или это проблема с тем, как sinon определяет, было ли что-то вызвано? Есть ли обходной путь?

РЕДАКТИРОВАТЬ: Вот решение для моего конкретного примера, основанное на методе исправления обезьяны принятого ответа. Хотя это несколько строк дополнительного кода настройки в самом тесте (мне больше не нужна функция модуля), он выполняет свою работу. Спасибо, mu слишком короткое

test("intra-model event bindings", function() {
    var that = this;
    var init = TestModel.prototype.initialize;
    TestModel.prototype.initialize = function() {
        that.spy(this, 'doSomething');
        init.call(this);
    };

    this.testModel = new TestModel();
    . . . // tests pass!
}); 
6
задан Ben Roberts 2 June 2012 в 22:06
поделиться