假设我有以下模块:
var modulesReq = require.context('.', false, /\.js$/);
modulesReq.keys().forEach(function(module) {
modulesReq(module);
});
Jest 提示是因为它不知道
require.context
: FAIL /foo/bar.spec.js (0s)
● Runtime Error
- TypeError: require.context is not a function
我怎么能 mock 它?我尝试使用
setupTestFrameworkScriptFile
Jest 配置,但测试看不到我在 require
中所做的任何更改。 最佳答案
我遇到了同样的问题,然后我做了一个“解决方案”。
我很确定这不是最佳选择。根据此处回答的要点,我最终停止使用它:
https://github.com/facebookincubator/create-react-app/issues/517
https://github.com/facebook/jest/issues/2298
但是如果你真的需要它,你应该在你调用它的每个文件中包含下面的 polyfill(不是在测试文件本身,因为 require
在 Node 环境中不会被全局覆盖)。
// This condition actually should detect if it's an Node environment
if (typeof require.context === 'undefined') {
const fs = require('fs');
const path = require('path');
require.context = (base = '.', scanSubDirectories = false, regularExpression = /\.js$/) => {
const files = {};
function readDirectory(directory) {
fs.readdirSync(directory).forEach((file) => {
const fullPath = path.resolve(directory, file);
if (fs.statSync(fullPath).isDirectory()) {
if (scanSubDirectories) readDirectory(fullPath);
return;
}
if (!regularExpression.test(fullPath)) return;
files[fullPath] = true;
});
}
readDirectory(path.resolve(__dirname, base));
function Module(file) {
return require(file);
}
Module.keys = () => Object.keys(files);
return Module;
};
}
使用此函数,您无需更改任何
require.context
调用,它将以相同的行为执行(如果它在 webpack 上,它将只使用原始实现,如果它在 Jest 执行中,使用 polyfill 函数) .关于javascript - 如何在 Jest 中模拟 Webpack 的 require.context?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38332094/