Mocha.js и sinon spy в Backbone.js

Вопрос:

У меня есть манекен Backbone.Model

App.Models.Note = Backbone.Model.extend({
default: {
title: ''
}
);

и Backbone.View для моей модели:

  App.Views.NoteView = Backbone.View.extend({

template: ...,

initialize: function () {
this.listenTo(this.model, "change", this.render);
this.render();
},

render: function () {
this.$el.html(this.template({
title: this.model.get("title")
}));
return this;
}
});

Для тестирования я использую mocha.js + chai + sinon, и у меня есть следующий тест

 describe("App.Views.NoteView", function () {
beforeEach(function () {
this.view = new App.Views.NoteView({
el: this.$fixture,
model: new App.Models.Note()
});
}

afterEach(function () {
this.view.model.destroy();
});

it("my try 1", function () {
var mySpy1 = sinon.spy(this.view, "render");

this.view.model.set({
title: "a new Title"
});

expect(this.view.render).to.have.been.calledOnce;
});
}

То, что я пытаюсь проверить, – это подсмотреть метод render: при изменении атрибутов модели render метод render. Однако, даже если рендеринг выполняется нормально, тест дает мне ошибку

'expected render to be called once but was called 0 times'

Любая помощь?

Ответ №1

Фактически, когда представление инициализируется, он связывает с ним функцию рендеринга. Поэтому, когда мы пытаемся связать эту функцию рендеринга со шпионом, она не позволяет. Для этого нам нужно связать шпион перед инициализацией вида.

Попробуй это:

  var mySpy1 = null;
describe("App.Views.NoteView", function () {
beforeEach(function () {
mySpy1 = sinon.spy(App.Views.NoteView.prototype, "render");
this.view = new App.Views.NoteView({
el: this.$fixture,
model: new App.Models.Note()
});
}

afterEach(function () {
this.view.model.destroy();
//Restore
App.Views.NoteView.prototype.render.restore();
});

it("my try 1", function () {
this.view.model.set({
title: "a new Title"
});

expect(mySpy1.called).to.be.true;
});

}

Оцените статью
TechArks.Ru
Добавить комментарий