如何创建一个扩展实际模块的模拟游戏

问题描述:

我有一个模拟__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.jsconst 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')