Следите за конструктором с помощью Jasmine - PullRequest
58 голосов
/ 19 февраля 2012

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

У меня есть виджет jQuery, который создает объекты flipcounter и вызывает для них метод setValue.Код для flipcounter находится здесь: https://bitbucket.org/cnanney/apple-style-flip-counter/src/13fd00129a41/js/flipcounter.js

Флип-счетчики создаются с использованием:

var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});

Я хочу проверить, созданы ли флип-счетчики и для них вызывается метод 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 ]

41 голосов
/ 19 февраля 2012

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);
10 голосов
/ 09 июня 2016

Я бы предложил использовать jasmine.createSpyObj(), если вы хотите смоделировать объекты со свойствами, за которыми необходимо следить.

myStub = jasmine.createSpyObj('myStub', ['setValue']);
spyOn(window, 'flipCounter').andReturn(myStub);

Это тестирует взаимодействия с ожидаемым интерфейсом flipCounter, вне зависимости от реализации flipCounter.

4 голосов
/ 20 октября 2015

Вы должны реализовать поддельный конструктор для 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);
  });
});
3 голосов
/ 05 июня 2014

Следующее не зависит от «окна».Допустим, это код, который вы хотите проверить -

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});
1 голос
/ 20 сентября 2017

Моя версия для тестирования конструктора - шпионить за прототипом:

spyOn(flipCounter.prototype, 'setValue').and.callThrough();
var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});
expect(flipCounter.prototype.setValue).toHaveBeenCalledTimes(1);
0 голосов
/ 19 февраля 2012

Не знаю, как это сделать, используя жасминовые насмешки, но если вам нужны мощные насмешки / шпионы / заглушки, я рекомендую sinon.js , который очень хорошо работает с жасмином.

Из документов:

Тестовый шпион - это функция, которая записывает аргументы, возвращаемое значение, Значение this и исключение выдается (если есть) для всех его вызовов. Тест Шпион может быть анонимной функцией или обернуть существующую функцию.

Издевательства (и ложные ожидания) являются поддельными методами (например, шпионами) с запрограммированное поведение (например, заглушки), а также запрограммированное ожидания. Поддельный провалит ваш тест, если он не используется как ожидается.

С помощью sinon.js вы можете создать макет конструктора flipCounter, который возвращает другого шпиона.

Затем подтвердите, что конструктор был вызван с помощью constructorMock.calledWithNew (), и подтвердите, что возвращенный шпион был вызван с помощью returnSpy.calledWith (arg1, arg2 ...).

...