常见错误
找不到模块 './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'
。
在您的配置文件中指定 pool
:
ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'forks',
},
});
或者在您的 package.json
脚本中:
diff
scripts: {
- "test": "vitest"
+ "test": "vitest --pool=forks"
}