TypeScript测试环境下Awilix无法自动加载模块的问题求助
测试环境下Awilix自动加载模块失败问题
技术栈版本
"typescript": "^5" "vitest": "^1" "awilix": "^8"
目录结构
./ ├── tsconfig.json ├── vitest.config.mts ./src/ ├── Connection │ └── Mongoose.ts ├── Core │ └── Container.ts └── init.ts ./test/ ├── Connection │ └── Mongoose.test.ts ├── Core │ └── Container.test.ts └── tsconfig.json
配置文件内容
根目录tsconfig.json
{ "extends": "@tsconfig/node-lts/tsconfig.json", "compilerOptions": { "lib": ["WebWorker", "ESNext", "ES2022", "DOM"], "rootDir": ".", "outDir": "build", "esModuleInterop": true, "resolveJsonModule": true, "skipLibCheck": true, "allowSyntheticDefaultImports": true, "importHelpers": true, "alwaysStrict": true, "sourceMap": true, "declaration": true, "declarationDir": "./build/@types", "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, "noImplicitReturns": true, "noUnusedLocals": true, "noUnusedParameters": true, "noImplicitAny": false, "noImplicitThis": false, "strictNullChecks": true, "useUnknownInCatchVariables": true, }, "types": ["node"], "include": ["src/**/*.ts", ".eslintrc.js"], "exclude": ["node_modules", "**/node_modules/*", "**/dist/*", "**/build/*"] }
vitest.config.mts
import { defineConfig } from "vitest/config"; export default defineConfig({ test: { environment: "node", globals: true, include: ['test/**/*.test.ts'], exclude: ['**/node_modules/**', '**/dist/**', '**/build/**'], deps: { moduleDirectories: ["node_modules"], }, coverage: { all: true, provider: "v8", reportsDirectory: "./coverage", enabled: true, include: ['src/**/*'], reporter: [ "text", "json", "html", "lcov", "clover", "json-summary", "text-summary", ], }, poolOptions: { threads: { singleThread: true, }, }, }, });
核心代码
src/Core/Container.ts(容器初始化逻辑)
import { resolve } from "path"; import { createContainer, AwilixContainer, Lifetime, asClass, } from "awilix"; export interface Cradle {} export default async (): Promise<AwilixContainer<Cradle>> => { const container = createContainer(); container.loadModules( [ `${resolve(__dirname, "../Connection/*.js")}`, `${resolve(__dirname, "../Connection/**/*.js")}`, ], { resolverOptions: { lifetime: Lifetime.SINGLETON, register: asClass, }, } ); return container; };
非测试环境验证代码(src/init.ts)
import initContainer from "src/Core/Container"; export default async (): Promise<void> => { const container = await initContainer(); console.log(container.resolve("Mongoose")); // 输出: Mongoose {} };
问题现象
在测试环境中运行测试时,Awilix无法加载模块:
测试代码(test/Connection/Mongoose.test.ts)
import initContainer from "src/init"; describe("Mongoose", () => { it("Connect", async () => { const container = await initContainer(); console.log(container.registrations); // 输出: {} expect(true).toBeTruthy(); }); });
尝试过的方案
- 将
test/目录加入tsconfig.json的编译范围,修改vitest.config.mts从build/test/运行测试,虽然能解决问题,但不确定是否合理,且不想在package.json中设置type: module。 - 替换为Jest(版本^29),遇到完全相同的问题。Jest配置如下:
import { type JestConfigWithTsJest } from 'ts-jest'; const jestConfig: JestConfigWithTsJest = { testRegex: '(/test/.*\\.(test|spec))\\.(ts|js)$', testPathIgnorePatterns: ['/lib/', '/node_modules/'], moduleFileExtensions: ['ts', 'js', 'json', 'node'], collectCoverage: true, }; export default jestConfig;
求解决测试环境下Awilix无法自动加载模块的问题。
内容的提问来源于stack exchange,提问作者Ali Tavafi
相关产品推荐
相关产品推荐

