2015-10-29 7 views
2

Мне было поручено написать тесты для следующего вида Backbone. Однако я не написал код.метод sinon - stub private variable

В следующем примере кода я хочу, чтобы заглушить/шпионить метод update, чтобы я мог проверить, что функция вызывается, когда атрибут liked модели вида изменен, но я, похоже, не могу настроить этот метод.

Можно ли отключить функцию update?

Когда я бегу моих тестов он записывает Hello но тест возвращает следующую ошибку: AssertionError: expected update to have been called at least once, but it was never called

my.Special.Class.LikeButton = function (options) { 
    /* ***** Other private variables ******* */ 

    var LikeButton = Marionette.ItemView.extend({ 
     model: null, 
     sSolidPoly: null, 
     sEmptyPoly: null, 

     events: { 
      'click': 'toggleLike' 
     }, 

     initialize: function (options) { 

      //Listen to changes in like property in case it's changed from another location in the UI 
      this.listenTo(this.model, 'change:liked', this.update); 
     }, 

     onRender: function() { 
      this.setElement(this.el.innerHTML); 

     }, 

     update: function() { 
      console.log('Hello'); 
      ..... 
     } 
    }); 


    return new LikeButton(options); 
} 

Я попытался окурок функцию update в beforeEach функции для испытаний:

this._view = new my.Special.Class.LikeButton({ 
      template: '#like-button-template', 
      model: this.model 
     }); 

     this.updateStub = sinon.stub(this._view, 'update'); 

В моем тестовом наборе:

it('change to model liked attribute calls update', function() { 

     var __view = this._view.render(); 

     this.model.set({liked: true}); 

     expect(this.updateStub).has.been.called; 

    }); 

ответ

1

Я думаю, что это хороший пример тестового набора, который разоблачает нечто слишком вложенное. Имо, а не пытаться исправить это, вы должны иметь вложенный LikeButton в отдельный модуль и импортировать его в этот файл и протестировать его в собственном файле.

В противном случае попробуйте:

var model = ...; 
var likeButton = my.Special.Class.LikeButton({ model: model }); 
spyOn(likeButton, 'update'); 
model.set('liked', true); 
expect(likeButton.update).toHaveBeenCalledWith(model, true); 
+0

@hyprstack жаль, что я написал, что в синтаксисе жасмин! –

+1

Не беспокойтесь. Я думаю, что лучшим подходом было бы иметь его в отдельном модуле, как вы предложили. Другой подход возвращает ту же ошибку, что и я описал. – hyprstack

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