我在__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
}
我尝试在const originalMock = require('some-module')
中使用__mocks__/some-module.js
,但遇到了错误:
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
答案 0 :(得分:0)
模拟无法扩展它应该模拟的模块。会发生的是,在模块加载之前,Jest会重写路径,因此导入some-module
的每个模块都将获得模拟。所以最终模拟试图加载自己并失败。
在大多数情况下,也没有必要在模拟中使用真正的实现。在您的示例中,您可以使用返回已解析的承诺的函数替换请求,例如。
另一种方法是在测试中导入模块并覆盖该函数,但这仅在模块在导入后不直接使用函数时才有效。
import MyModule from 'my-module`
MyModule.func = () => Promise.resolve('test123')
答案 1 :(得分:0)
嘿,我在搜索类似的东西时遇到了这个。
jest 提供了一种使用 requireActual
实现此目的的方法。
你可以使用 requireActual 来引用原始模块
__mocks__/some-module.js
module.exports = {
func: () => {
// Do stuff
},
constants: jest.requireActual('some-module').constants
}
参考:https://jestjs.io/docs/jest-object#jestrequireactualmodulename