Как шпионить за методом внутри зависимого модуля с помощью jasmine-node

Я пытаюсь написать жасминовые тесты для модуля (скажем, модуля A), который «требует» другого модуля (модуль B).

======> модульB.js

function moduleBFunction(){
   console.log('function inside moduleB is called');
}

======> модульA.js

var moduleB = require('./moduleB');
function moduleAfunction(input){
   if(input){
      moduleB.moduleBFunction()
   }

}

Я хочу написать тестовый пример жасмина, который проверяет, когда я вызываю moduleAfunction, вызывает ли он moduleBfunction или нет. Я попытался написать тест, используя spyOn(). но я не уверен, как я могу издеваться над методом внутри зависимого модуля. Я провел некоторое исследование и обнаружил, что могу использовать для этой цели модуль «rewire», как показано ниже.

var moduleB = require('../moduleB');
moduleB.__set__('moduleBfunction', moduleBfunctionSpy);
moduleA.__set__('moduleB', moduleB);
it('should call moduleBfunction', function(){
    moduleA.moduleAfunction()
    expect(moduleB.moduleBfunction()).toHaveBeenCalled()
});

но я чувствую, что должен быть более простой способ.

Пожалуйста, предложите.


person Vijay Kasina    schedule 02.05.2016    source источник


Ответы (1)


Я рекомендую sinon.js

var sinon = require('sinon')
var moduleA = require('../moduleA')
var moduleB = require('../moduleB')


it('should call moduleBfunction', function() {
  var stub = sinon.stub(moduleB, 'moduleBfunction').returns()
  moduleA.moduleAfunction()
  expect(moduleB.moduleBfunction.calledOnce)
  stub.restore()
})

Вы можете легко имитировать множество разных моделей поведения, таких как:

  • заглушки выбрасывает
  • заглушка возвращает определенное значение
  • заглушка выдает (имитирует асинхронный обратный вызов)
  • заглушка работает ограниченно только для определенных входных аргументов

Не забудьте восстановить каждую заглушку перед выполнением следующего теста. Лучше всего использовать песочницы и afterEach/beforeEach

describe('tests which require some fakes', function() {
  var sandbox

  beforeEach(function() {
    sandbox = sinon.sandbox.create()
  })

  afterEach(function() {
    sandbox.restore()
  })
})
person lipp    schedule 02.05.2016