You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
  });
});

尝试过的方案

  1. 将test/目录加入tsconfig.json的编译范围,修改vitest.config.mts从build/test/运行测试,虽然能解决问题,但不确定是否合理,且不想在package.json中设置type: module。
  2. 替换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:34:53