Как использовать при импорте модулей (@) в функции Jest globalSetup с TypeScript?

Используя хук JS для вызова функции TS setupGlobal (которая используется при импорте модулей, например @app/blablabla.ts), я получаю сообщение об ошибке Cannot find module '@config/config'. Я описал moduleNameMapper, и он работает в тестах, но, похоже, его нет в функции setupGlobal. Как я могу это исправить?

Как я уже писал, moduleNameMapper описан, и Jest может понять этот (в модулях) импорт в тестах.

jest.config.js

module.exports = {
  roots: ['<rootDir>/src'],
  transform: {
    '^.+\\.tsx?$': 'ts-jest',
  },
  testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
  moduleDirectories: ['node_modules', 'src'],
  moduleNameMapper: {
    '@tests-suite/(.*)': '<rootDir>/src/tests/tests-suite/$1',
    '@config/(.*)': '<rootDir>/config/$1',
    '@tests/(.*)': '<rootDir>/src/tests/$1',
    '@src/(.*)': '<rootDir>/src/$1',
  },
  globalSetup: "<rootDir>/src/tests/unit/jestGlobalSetup.js"
}

jestGlobalSetup.js

require("ts-node/register");
module.exports = require('./setupTestEnvironment').default;

setupTestEnvironment.ts

import { dbConnectionManager } from '@src/dbConnectionManager'

// tslint:disable-next-line:no-default-export
export default async () => {
  if (process.env.NODE_ENV === 'test') {
    setupTestEnvironment()
  }
}

const setupTestEnvironment = async () => {
  await dbConnectionManager.awaitConnection()
}

Я ожидаю, что импорт «в модуле» будет выполняться в функции setupGlobal, но это выдает ошибку.

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
5
0
1 856
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо. Проблема в том, что мы использовали абсолютные пути, была решена путем установки ts-jest и добавления следующего jest.config.js:

    module.exports = {
  roots: [
    '<rootDir>/src',
  ],
  testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
  moduleFileExtensions: [
    'js',
    'json',
    'jsx',
    'node',
    'ts',
    'tsx',
  ],
  moduleDirectories: [
    'node_modules',
    'src',
  ],
  moduleNameMapper: {
    '^@tests\\-suite/(.*)$': '<rootDir>/src/tests/tests-suite/$1',
    '^@admin/(.*)$': '<rootDir>/src/admin/$1',
    '^@common/(.*)$': '<rootDir>/src/common/$1',
    '^@app/(.*)$': '<rootDir>/src/app/$1',
    '^@partners/(.*)$': '<rootDir>/src/partners/$1',
    '^@config/(.*)$': '<rootDir>/config/$1',
    '^@tests/(.*)$': '<rootDir>/src/tests/$1',
    '^@src/(.*)$': '<rootDir>/src/$1',
  },
  setupFilesAfterEnv: [`<rootDir>/src/tests/setup/GlobalSetup.ts`],
  preset: 'ts-jest',
  testMatch: null,
};

А наш скрипт запуска выглядит так "test:jest": "NODE_ENV=test yarn ts-node -r tsconfig-paths/register ./src/tests/setup/testInit.ts"

И testInit выглядит так;

import { runCLI } from 'jest'

// globalSetup
async function init() {
  console.info('Initialization')

  await runCLI({ config: './jest.config.js', watch: true } as any, [__dirname])

  // Do all your initialization stuff
  // I use a setTimeout to simulate true async
  return new Promise<void>((resolve, _reject) => {
    setTimeout(() => {
      console.info('Init finished')
      resolve()
    }, 1000)
  })
}

// globalTeardown
async function afterTests(): Promise<void> {
  console.info('End of tests - Execute something')
}

init()
  .then(() => {
    afterTests()
  })
  // tslint:disable-next-line:no-console
  .catch(e => console.error(e))

GlobalSetup.ts выглядит так:

import { DBConnectionManager } from '@src/DBConnectionManager'

beforeAll(async () => {
  await DBConnectionManager
  .awaitConnection()
})

Итак, DBConnectionManager — это просто оболочка TypeORM, которая дает нам связь. Он подключается перед каждым тестом, чтобы попасть в настоящую тестовую БД. Это работает на данный момент.

Я бы сказал, что это не правильное решение. У меня такая же ситуация, я не могу найти псевдонимы, когда использую globalSetup, но он работает нормально с «setupFilesAfterEnv», который полностью отличается от «globalSetup». setupFilesAfterEnv запускается перед каждым тестом, а globalSetup запускается только один раз перед всеми тестами. Удалось ли вам решить это должным образом?

Javier Guzmán 28.12.2020 17:04

@ JavierGuzmán Нет, я этого не делал. Мы отказались от этого. Вы нашли решение?

hypeofpipe 29.12.2020 15:54

Более или менее... решение состоит в том, что, к сожалению, это невозможно, основываясь на комментариях к этой проблеме: github.com/facebook/jest/issues/6048

Javier Guzmán 31.12.2020 09:17

Другие вопросы по теме