如何创建一个在jest中扩展实际模块的模拟

时间:2017-04-06 17:37:50

标签: javascript node.js unit-testing jestjs

我在__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

2 个答案:

答案 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