开玩笑-未导出的模拟功能

时间:2019-02-01 17:08:46

标签: javascript node.js unit-testing jestjs

我有一个文件可以导出一个依赖于私有函数的函数:

function __a(filePath, someFunction){
  // do some file request
  someFunction(filePath)
}

function b(filePath){
  __a(filePath, require)
}

module.exports = {
  b: b
}

我想测试一下私有函数__a toHaveBeenCalledWith的一些参数,以便__a实际上并未尝试获取某些我不能保证存在的文件。

我了解这样的概念:导入b时会得到对该函数的引用,而__a只是存在于该函数的范围内,因此我无法访问它使用类似的东西:

import appResources from './index';
// ... test
jest.spyOn(applicationResources, '__a').mockImplementationOnce(myParams);

如何避免此处发生__a行刑并确保已被执行?

1 个答案:

答案 0 :(得分:2)

不可能模拟或监视未用作方法的现有函数。

__ab应该驻留在不同的模块中,或者a应该用作同一模块中的方法。对于CommonJS模块,可以使用现有的exports对象:

exports.__a = function __a(filePath, someFunction){
  // do some file request
  someFunction(filePath)
}

exports.b = function b(filePath){
  exports.__a(filePath, require)
}

请注意,module.exports未被替换,否则将无法将其称为exports