2015-04-14 2 views
1

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

var model = Backbone.Model.extend({ 
    initialize: function(parameters) { 
     var object = { 
      key: parameters.key 
     }; 
     this.callMethod(); 
     this.collection = new Backbone.Collection(); 
    }, 

    callMethod: function() { 
     //code I want to test 
    } 
}); 

Как проверить новый экземпляр этой модели без setuping всего этого объекта или любого другого материала, который не имеет отношения к испытанию с использованием QUnit и Sinon? Должен ли я каким-либо образом заглушить этот метод инициализации перед инициализацией модели? Каков правильный способ сделать это, используя эти две библиотеки?

Спасибо за ваше время.

+0

Я хотел бы указать, что ваш заголовок немного выключен, вы не пытаетесь заглушить конструктор, но инициализируете. Это две [разные] (http://backbonejs.org/#Model-constructor) вещи. И да, вы должны заглушить его перед инициализацией новой модели, заглушка - это не машина времени. Что касается Sinon, я не использовал ее много, но выглядел достаточно просто: http://sinonjs.org/docs/#stubs – ivarni

+0

Назовите меня немым, но я просто не понимаю, как вы можете заглушить метод объекта, который еще не создан? Основное stubbing выглядит так: stub = sinon.stub (object, 'methodName'). Я не смог найти пример с stubbing перед инициализацией. – DasBoot

+0

О, хорошо, это хороший момент, я не рассматривал эту импликацию, поскольку я был занят запутыванием конструктора/инициализации. Я попытался бы заглушить его на прототипе (т. Е. Попытаться заглушить 'model.prototype.initialize' перед выполнением' new model() ') – ivarni

ответ

0

Как только у вас нет экземпляра модели, вы можете заглушить Model.prototype.

Пример:

spyOn(Model.prototype, "initialize"); 
var modelInstance = new Model(); 
expect(Model.prototype.initialize).toHaveBeenCalled() 
0

Как указано в комментарии, по-видимому ОП действительно ищет initialize заглушки, а не constructor заглушки, и это на самом деле очень легко сделать:

sinon.stub(YourModel.prototype, 'initialize'); 

Но чтобы ответить на вопрос в строке темы, для всех, кто читает это ... обрезание конструктора немного сложнее, потому что конструктор - это в основном сам класс (то есть YourModel - это функция-конструкторКласс). Это важно, потому что Синон знает только, как работают заглушки, свойства что-то (например, initialize является собственностью YourModel.prototype). Другими словами, Синон может только заглушить методы , а constructor - это не метод.

Решение этого - посмотреть на код, который вы пытаетесь проверить, и посмотреть, как он получает конструктор, прежде чем он его использует. Например, предположим, что вы хотите проверить, что FakeView конкретизирует YourModel в методе foo:

var FakeView = Backbone.View.extend({ 
    foo: function() { return new YourModel(); } 
}); 

Когда написано так, что YourModel не может быть погасил. Но если изменить его немного, так что YourModelявляется свойство:

var FakeView = Backbone.View.extend({ 
    foo: function() { return new this.constructor.modelClass(); } 
}, { 
    modelClass: YourModel 
}); 

вдруг вы можете окурок его:

var stub = sandbox.stub(FakeView, 'modelClass'); 
new FakeView().foo(); // stub.calledWithNew() === true 

Надежда, что помогает кому-либо еще борется с этим.

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