Mocha.js и sinon шпионят в 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. Однако, даже если рендер выполняется нормально, тест выдает ошибку

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

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


person user711189    schedule 17.07.2014    source источник
comment
извините, не уверен, что понимаю, всегда ли это дает ошибку или только тогда, когда вы не меняете атрибут модели?   -  person Quince    schedule 17.07.2014
comment
при изменении названия модели метод рендеринга вызывается нормально. Однако ожидание вызывает ошибку выше   -  person user711189    schedule 17.07.2014
comment
во всяком случае, я нашел здесь похожие вопросы: ?rq=1" title="почему этот синон-шпион не вызывается, когда я запускаю этот тест"> stackoverflow.com/questions/8441612/   -  person user711189    schedule 17.07.2014


Ответы (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;
   });

}

person Emmad Zahid    schedule 06.03.2015