如何使用jasmine-node监视依赖模块内的方法

时间:2016-05-02 17:23:08

标签: javascript node.js jasmine frontend jasmine-node

我正在尝试为模块编写茉莉花测试 - 比如说“moduleA”,它需要另一个模块 - (moduleB)。

==> moduleB.js

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

==> moduleA.js

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

}

我想编写一个jasmine测试用例,测试我何时调用moduleAfunction,是否调用moduleBfunction。我尝试使用spyOn()编写测试。但我不知道如何在依赖模块中模拟一个方法。我做了一些研究,发现我可以使用'重新连接'模块,如下所示

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

但我觉得应该有一个更简单的方法。

请建议。

1 个答案:

答案 0 :(得分:2)

我建议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()
  })
})