Шпионаж за конструктором с помощью Жасмин



Я использую Жасмин, чтобы проверить, если определенные объекты создаются и методы вызываются на них.



у меня есть виджет 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() метод не существует". Я делаю это правильно? Спасибо!

576   6  

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

    Ничего не найдено.