先说结论
配置文件中有projects字段的,需要在projects字段内部定义globals,外层的globals会被覆盖
const config = {
...,
preset: 'ts-jest',
projects: [
{
testMatch: [
'<rootDir>/packages/p1/**/__tests__/*.test.*',
'<rootDir>/packages/p2/**/__tests__/**/*.test.*',
],
testEnvironment: 'jsdom',
globals: {
window: true,
DEPRECATED_ADAPTER_COMPONENT: false,
ENABLE_INNER_HTML: true,
ENABLE_ADJACENT_HTML: true,
ENABLE_SIZE_APIS: true,
ENABLE_TEMPLATE_CONTENT: true,
ENABLE_CLONE_NODE: true,
ENABLE_CONTAINS: true,
ENABLE_MUTATION_OBSERVER: true,
},
},
],
};
背景
Taro项目单测,报错ReferenceError: ENABLE_INNER_HTML is not defined
查阅 Taro文档 后得知使用jest需要在其config中添加一系列globals变量
但配置完成后依旧报错,且尝试直接在测试文件调用配置文件中定义的globals变量也是undefined
分析
各种谷歌也没找到相应的解决方法,于是开始阅读Jest源码
配置读取逻辑在<rootDir>/node_modules/jest-config/build/index.js/readConfigs
async function readConfigs(argv, projectPaths) {
let globalConfig;
let hasDeprecationWarnings;
let configs = [];
let projects = projectPaths;
let configPath;
// 读取配置文件外层config
if (projectPaths.length === 1) {
const parsedConfig = await readConfig(argv, projects[0]);
...
// 此时globals还存在
configs = [parsedConfig.projectConfig];
...
}
// 若存在projects字段
if (projects.length > 0) {
...
const parsedConfigs = await Promise.all(
projects
.filter(root => {
...
return true;
})
.map((root, projectIndex) => {
...
// 读取projects字段配置
return readConfig(
argv,
root,
skipArgvConfigOption,
configPath ? path().dirname(configPath) : cwd,
projectIndex, // we wanna skip the warning if this is the "main" project
projectIsCwd,
projectIndex
);
})
);
...
// 覆盖第一步的configs,此时globals已消失
configs = parsedConfigs.map(({projectConfig}) => projectConfig);
...
return {
configs,
globalConfig,
hasDeprecationWarnings: !!hasDeprecationWarnings
};
}
读取projects字段配置的readConfig函数也在这个文件中,感兴趣的可以去看看
后话
今天突发奇想读源码,果然代码这种纯客观的东西,直接看比问来问去要准确的多