Шпионаж за конструктором с помощью Жасмин
Я использую Жасмин, чтобы проверить, если определенные объекты создаются и методы вызываются на них.
у меня есть виджет jQuery, который создает объекты flipcounter и вызывает метод setValue на них. Код для flipcounter находится здесь: https://bitbucket.org/cnanney/apple-style-flip-counter/src/13fd00129a41/js/flipcounter.js
flipcounters создаются с помощью:
var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});
Я хочу проверить, что flipcounters создаются и на них вызывается метод setValue. Моя проблема заключается в том, как я могу шпионить за этими объектами еще до их создания? Я шпионю за конструктором и возвращаю поддельные объекты? Пример кода действительно поможет. Спасибо за вашу помощь! :)
обновление:
Я пробовал шпионить за flipCounter вот так:
myStub = jasmine.createSpy('myStub');
spyOn(window, 'flipCounter').andReturn(myStub);
//expectation
expect(window.flipCounter).toHaveBeenCalled();
затем тестирование для вызова setValue с помощью flipCounter:
spyOn(myStub, 'setValue');
//expectation
expect(myStub.setValue).toHaveBeenCalled();
первый тест для инициализации flipCounter в порядке, но для тестирование вызова setValue, все, что я получаю, это ошибка "setValue() метод не существует". Я делаю это правильно? Спасибо!
6 ответов:
flipCounter- это просто еще одна функция, даже если она бывает для создания объекта. Следовательно, вы можете сделать:var cSpy = spyOn(window, 'flipCounter');чтобы получить шпиона на нем, и сделать все виды проверок на нем или сказать:
var cSpy = spyOn(window, 'flipCounter').andCallThrough(); var counter = flipCounter('foo', options); expect(cSpy).wasCalled();однако, это кажется излишним. Достаточно было бы сделать:
var myFlipCounter = new flipCounter("counter", options); expect(myFlipCounter).toBeDefined(); expect(myFlipCounter.getValue(foo)).toEqual(bar);
Я бы предложил использовать
jasmine.createSpyObj()когда вы хотите издеваться над объектами со свойствами, за которыми нужно следить.myStub = jasmine.createSpyObj('myStub', ['setValue']); spyOn(window, 'flipCounter').andReturn(myStub);это проверяет взаимодействие с ожидаемым
flipCounterинтерфейс, без зависимости отflipCounterреализация.
вы должны реализовать поддельный конструктор для
flipCounterзадаетsetValueсвойство для функции шпиона. Допустим, функция, которую вы хотите проверить, это:function flipIt() { var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500}); myFlipCounter.setValue(100); }ваша спецификация должна выглядеть так:
describe('flipIt', function () { var setValue; beforeEach(function () { setValue = jasmine.createSpy('setValue'); spyOn(window, 'flipCounter').and.callFake(function () { this.setValue = setValue; }); flipIt(); }); it('should call flipCounter constructor', function () { expect(window.flipCounter) .toHaveBeenCalledWith("counter", {inc: 23, pace: 500}); }); it('should call flipCounter.setValue', function () { expect(setValue).toHaveBeenCalledWith(100); }); });
следующее не зависит от "окна". Допустим, это код, который вы хотите проверить -
function startCountingFlips(flipCounter) { var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500}); }ваш тест может быть -
var initSpy = jasmine.createSpy('initFlipCounter'); var flipCounter = function(id, options) { initSpy(id, options); } startCountingFlips(flipCounter); expect(initSpy).toHaveBeenCalledWith("counter", {inc:23, pace:500});
моя версия для тестирования конструктора-это шпионить за прототипом:
spyOn(flipCounter.prototype, 'setValue').and.callThrough(); var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500}); expect(flipCounter.prototype.setValue).toHaveBeenCalledTimes(1);
Не знаю, как это сделать с помощью Жасмин издевается, но если вы хотите мощный издевательство / шпион / заглушки я рекомендую Синон.js, который очень хорошо работает с Жасмин.
из документов:
тестовый шпион-это функция, которая записывает аргументы, возвращаемое значение, значение этого и исключение, брошенное (если таковое имеется) для всех его вызовов. Испытание шпион может быть анонимной функцией или он может обернуть существующую функцию.
издевается (и насмешливые ожидания) являются поддельные методы (например, шпионы) с запрограммированное поведение (например, заглушки) , а также запрограммированное ожидания. Макет провалит ваш тест, если он не используется в качестве ожидаемый.
с Синон.js вы можете создать макет конструктора flipCounter, который возвращает другого шпиона.
затем утверждают, что конструктор был вызван с помощью constructorMock.calledWithNew (), и утверждают, что возвращенный шпион был вызван с returnedSpy.calledWith(arg1, arg2...).
Comments