常见错误
无法找到模块 './relative-path'
如果您收到模块无法找到的错误,这可能意味着以下几种情况:
- 您拼写了错误的路径。请确保路径正确。
- 您可能在
tsconfig.json
中配置了baseUrl
。Vite 默认不会考虑tsconfig.json
的配置,因此如果您依赖此行为,可能需要自行安装vite-tsconfig-paths
。
- 您可能在
ts
import { defineConfig } from 'vitest/config';
import tsconfigPaths from 'vite-tsconfig-paths';
export default defineConfig({
plugins: [tsconfigPaths()],
});
或者重写您的路径,使其不使用相对于根目录的方式:
diff
- import helpers from 'src/helpers'
+ import helpers from '../src/helpers'
- 确保您没有使用相对于根目录的 别名。Vite 会将它们视为相对于导入文件而非项目根目录。
ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
alias: {
'@/': './src/',
'@/': new URL('./src/', import.meta.url).pathname,
},
},
});
无法模拟 "./mocked-file.js",因为它已被加载
当对已加载的模块调用 vi.mock
方法时,将会发生此错误。Vitest 抛出此错误是因为此调用无效,因为已缓存的模块会优先被使用。
请记住,vi.mock
总是会被提升(hoisted)——这意味着模块在测试文件开始执行之前就已经加载了,很可能是在 setup 文件中。要修复此错误,请删除导入或在 setup 文件末尾清除缓存。请注意,在这种情况下,setup 文件和您的测试文件将引用不同的模块实例。
ts
// setupFile.js
import { vi } from 'vitest';
import { sideEffect } from './mocked-file.js';
sideEffect();
vi.resetModules();
终止 worker 失败
当 NodeJS 的 fetch
与默认的 pool: 'threads'
一起使用时,可能会出现此错误。此问题已在 Timeout abort can leave process(es) running in the background #3077 中被跟踪。
作为临时解决方案,您可以切换到 pool: 'forks'
或 pool: 'vmForks'
。
ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'forks',
},
});
bash
vitest --pool=forks
Segfaults 和原生代码错误
在 pool: 'threads'
中运行 原生 NodeJS 模块 可能会遇到原生代码中出现的难以理解的错误。
Segmentation fault (core dumped)
thread '<unnamed>' panicked at 'assertion failed
Abort trap: 6
internal error: entered unreachable code
在这些情况下,原生模块很可能不是为多线程安全而设计的。作为临时解决方案,您可以切换到 pool: 'forks'
,它会在多个 node:child_process
中运行测试用例,而不是在多个 node:worker_threads
中。
ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'forks',
},
});
bash
vitest --pool=forks