如何创建一个扩展实际模块的模拟游戏
问题描述:
我有一个模拟__mocks__/some-module.js
模拟我调用some-module
的模块。我希望这个模拟具有与原始模块完全相同的功能,但选定的扩展除外。如何创建一个扩展实际模块的模拟游戏
例如,假设原来的模块(node_modules/some-module/index.js
)的样子:
module.exports = {
func:() => {
someHttpRequest()
},
constants: {A: 1, B: 2}
}
但在我的模拟(中__mocks__/some-module.js
)我想:
module.exports = {
func:() => {
// This is some overridden dummy function. It could be any function, doesn't matter.
},
constants: originalModule.constants // This is the line in which I am "extending" the original module's actual functionality
}
我试着在__mocks__/some-module.js
与const originalMock = require('some-module')
要求但遇到了一个错误:
Could not locate the bindings file. Tried:
→ path/node_modules/gc-stats/build/gcstats.node
→ path/node_modules/gc-stats/build/Debug/gcstats.node
→ path/node_modules/gc-stats/build/Release/gcstats.node
→ path/node_modules/gc-stats/out/Debug/gcstats.node
→ path/node_modules/gc-stats/Debug/gcstats.node
→ path/node_modules/gc-stats/out/Release/gcstats.node
→ path/node_modules/gc-stats/Release/gcstats.node
→ path/node_modules/gc-stats/build/default/gcstats.node
→ path/node_modules/gc-stats/compiled/6.3.1/darwin/x64/gcstats.node
答
模拟无法扩展它应该模拟的模块。发生的是,在模块加载之前,Jest会重写路径,因此导入some-module
的每个模块都将获得模拟。所以最后模拟试图加载自己并失败。
在大多数情况下,它也没有必要在模拟中有真正的实现。在你的例子中,例如,你可以用一个返回已解决承诺的函数替换请求。
另一种方法是在测试中导入模块并重写该函数,但这只有在模块在导入后不直接使用该函数时才有效。
import MyModule from 'my-module`
MyModule.func =() => Promise.resolve('test123')