2012-11-26 5 views
1

Я выполняю метод в методе инициализации Backbone's View.Метод sinon spy, который вызывается в режиме позвоночника, инициализирует

initialize : function(options) { 
     this.myMethod(); 
    } 

Я пытаюсь следить за этим методом с использованием Sinon как:

this.spyMyMethod = sinon.spy(this.view, "myMethod"); 

конца затем

it('should call my method', function(){ 
    expect(this.spyMyMethod).toHaveBeenCalledOnce(); 
}); 

но тест не пройден ...

Любые идеи?

ответ

3

Вы слишком поздно следите за методом.

Везде, где вы назначаете this.view Предполагаю, что это от звонка, такого как new Views.SomeView(). Это значит, что вызов new приведет к выполнению функции initialize.

Update

Я не рекомендую делать это, потому что это довольно грязный, но возможно, вы можете сделать что-то вроде следующего: (я не знаю Sinon, но это, как вы бы это сделать с шпионскими объектами базы жасминовый)

it('should call my method', function(){ 
    var dummyView = new Views.SomeView(); 
    spyOn(dummyView, "myMethod"); 
    spyOn(Views, "SomeView").andCallFake(function() { 
    dummyView.initialize(); 
    return dummyView; 
    }); 
    new Views.SomeView(); 
    expect(dummyView.myMethod).toHaveBeenCalled(); 
}); 

Другой Possiblilty

Похоже, это может быть возможным, чтобы переопределить этот метод с таким py, как показано ниже. Если это работает, возможно, это самый чистый способ сделать это.

it('should call my method', function(){ 
    spyOn(Views.SomeView.prototype, "myMethod"); 
    new Views.SomeView(); 
    expect(Views.SomeView.prototype.myMethod).toHaveBeenCalled(); 
}); 
+1

Есть ли способ шпионаже раньше? Может быть, шпионить прототип Backbone.View? – chchrist

+0

Может быть. Попробуйте что-то вроде того, что я добавил. Я действительно не рекомендую это делать. Он начинает выглядеть отвратительным и, возможно, не дает вам такой возможности для тестирования. –

+1

Второй пример работает как шарм. Благодаря! – chchrist

0

необходимо вернуть новый экземпляр вашего представления для метода инициализации, который будет вызываться.

Я не уверен, что this.view = new View(); уже, однако,

+0

Здравствуйте, я создаю новый экземпляр с новым – chchrist

Смежные вопросы