编写单元测试来检查模块内的模块是否正在被调用 - Node.js

问题描述 投票:0回答:1

我正在尝试为一个模块编写一个单元测试,该模块在其中调用另一个函数(作为模块)。测试是为了检查在调用主模块时是否正在调用导入的函数。

我一直在使用摩卡和柴。我还尝试了 Sinon 和 Proxyquire 的不同方法。

这些是模块和最近的测试尝试:

functionModule.js

module.exports = (param) => {
let somethingOld;
if (param) { 
somethingOld = param; 
}

return somethingOld
}

mainModule.js

const functionModule = require('./functionModule');

module.exports = (param1, param2) => {

 const somethingNew = functionModule(argument);

return {somethingNew}
}

mainModule.test.js

const mainModule = require('../mainModule.js');

describe('test mainModule', () => {
 it('test functionModule is called', () => {
   const getModuleSpy = chai.spy.on(mainModule, 'functionModule');

   mainModule(argument1, argument2);
  
   expect(getModuloSpy).to.have.been.called();
 })
})

我主要收到“AssertionError:预期 { Spy 'object.functionModule' } 已被调用”。

javascript node.js unit-testing mocha.js spy
1个回答
0
投票

可以使用sinon使用stub方法将原始函数复制到main函数中。然后,您可以使用 chai 和expect 来验证主函数中的函数是否正在被调用。 首先,您需要重构 functionModule.js 的导出方式:

const send = (param) => {
  let somethingOld;
  if (param) { 
    somethingOld = param; 
  }

  return somethingOld;
}

module.exports = { send: send }

同时修复你的 mainModule.js:

const functionModule = require('./functionModule');

module.exports = (param1, param2) => {
  const somethingNew = functionModule.send(argument);

  return {somethingNew}
}

然后像这样修复你的测试文件:

const mainModule = require('../mainModule.js');
const functionModule = require('../functionModule');
const sinon = require('sinon');
const { expect } = require('chai');

describe('test mainModule', () => {
 it('test functionModule is called', () => {
   const stubFunctionModule = sinon.stub(functionModule, 'send').returns(true);

   mainModule(argument1, argument2);
  
   expect(stubFunctionModule.calledOnce).to.be.true;
 })
})

确保变量 argument1argument2 是按值定义的。假设存根函数返回 true 结果值。看一下 Chai 文档,看到 CalledOnce 方法来验证存根函数是否被正确调用。

希望这对您有帮助。

问候

© www.soinside.com 2019 - 2024. All rights reserved.