在 Node.js 中使用 TypeScript 模拟 Jest 单元测试中的元素时找不到模块错误

问题描述 投票:0回答:1

我目前正在致力于将 Jest 单元测试集成到用 TypeScript 编写的 Node.js 应用程序中。但是,我在尝试模拟某些元素时遇到错误。这是我面临的具体错误:

这是我的测试文件(appcontroller.test.ts)的简化版本:

import 'reflect-metadata';
import AppController from '../controllers/AppController';
import { ResponseToolkit, Request } from '@hapi/hapi';
import Config from '../config/Config';

jest.mock('../controllers/AppController');
const mockToolkit = {} as ResponseToolkit;

describe('App Routes - V api', () => {
  it('should return version details', async () => {
    const mockedVersion = 'microservice-template';
    const mockedName = '0.0.1';
    const expectedResponse = {
      "data": {
        "version": "microservice-template",
        "name": "0.0.1"
      }
    };
    const mockRequest = {} as Request;
    (Config.get as jest.Mock).mockReturnValueOnce(mockedVersion).mockReturnValueOnce(mockedName);

    const mockController = jest.fn().mockResolvedValue(expectedResponse);
    const mockAppController = new AppController();
    mockAppController.getAppDetailsHandler = mockController;

    const handler = mockAppController.getAppDetailsHandler.bind(mockAppController);
    const response = await handler(mockRequest, mockToolkit);
    expect(mockController).toHaveBeenCalled();
    expect(response).toEqual(expectedResponse);
  });
});

这是我的 TypeScript 代码 (appcontroller.ts) 的相关部分:

import Hapi from '@hapi/hapi';
import { injectable } from 'inversify';
import Config from '@app/config/Config';
import BaseController from './BaseController';

@injectable()
export default class AppController extends BaseController {
 
  public async getAppDetailsHandler(request: Hapi.Request, h: Hapi.ResponseToolkit): Promise<Hapi.ResponseObject> {
    try {
      return this.buildResponse(h, {
        version: Config.get('serviceName'),
        name: Config.get('serviceVersion'),
      });
    } catch (error) {
      return this.handleErrors(h, error);
    }
  }
}

配置.ts

import convict from 'convict';
import dotenv from 'dotenv';
export const LOGGER_TYPE_FILE = 'file';
export const LOGGER_TYPE_CONSOLE = 'console';

/** Configure Dotenv to loads environment */
dotenv.config();

const configurationSchema = convict({
  env: {
    doc: 'The application environment.',
    format: ['local', 'dev'],
    default: 'local',
    env: 'NODE_ENV',
  },
  serviceName: {
    doc: 'Name of the service. It needs to be set in the package.json file.',
    format: String,
    default: process.env.npm_package_name ?? 'service_name_not_set',
    env: 'npm_package_name',
  },
  serviceVersion: {
    doc: 'Version of the service. It needs to be set in the package.json file.',
    format: String,
    default: process.env.npm_package_version ?? 'service_version_not_set',
    env: 'npm_package_version',
  },
});

const Config = configurationSchema.validate({ allowed: 'strict' });

export default Config;

我尝试通过不同的建议来解决此问题,其中之一是在 jest.config.js 中添加以下代码

 moduleNameMapper: {
    "^~(.*)$": "<rootDir>/src/$1"
  }

但我还是被困住了。有人可以提供有关如何解决此错误的指导吗?

预先感谢您的帮助!

node.js typescript unit-testing ts-jest hapi.js
1个回答
0
投票

Jest 有时会在导入打字稿时遇到此类问题。但是,在 Jest 配置 json 中,您可以指定

moduleNameMapper
来替换部分路径。

{
    "moduleFileExtensions": ["js", "json", "ts"],
    "moduleNameMapper": {
        "@app": "hello"
    }
}

参见 jest 的官方docs

© www.soinside.com 2019 - 2024. All rights reserved.