Как импортировать файл конфигурации, чтобы его можно было найти как встроенным пакетом, так и модулем в тесте Jest?

У меня есть проект Node, написанный на TypeScript, который использует Rollup в качестве сборщика и Jest в качестве среды модульного тестирования. Он имеет следующую структуру (я пропустил материал, который, как мне кажется, не имеет отношения к вопросу):

__tests__
   greeter.test.ts
   config.json
config
   template.config.json
src
   modules
      greeter.ts
   index.ts
jest.config.ts
package.json
tsconfig.json

src / index.ts:

import { greeter } from './modules/greeter'
console.log(greeter('Bojan'))

src / modules / greeter.ts:

const config = require('./config.json')
const greeting = config.greeting;
console.log(greeting)

export function greeter(name: string): string {
    return greeting + ", " + name
}

__tests __ / greeter.test.ts:

import {greeter} from '../src/modules/greeter';

test('greeter uses greeting specifies in the configuration file', () => {
  expect(greeter('ABC')).toBe('hi, ABC');
});

test('greeter uses the name specified as its runtime argument', () => {
  expect(greeter('ABC')).toContain('ABC');
});

jest.config.js:

module.exports = {
    "verbose": true,
    "transform": {
        "^.+\\.tsx?$": "ts-jest"
    },
    // "moduleDirectories": [
    //     "node_modules", 
    //     "<rootDir>/__tests__/"
    // ],
    // "modulePaths": [
    //     "<rootDir>/__tests__/"
    // ]
};

package.json:

{
  ...
  "main": "index.js",
  "scripts": {
    "clean": "rm -rf ./build/",
    "test": "jest --verbose --coverage --debug --env node",
    "build": "npx rollup -c",
    "start": "node ./build/app.js"
  },
  ...
  "devDependencies": {
    "@types/jest": "^24.0.11",
    "@types/node": "^11.13.0",
    "jest": "^24.7.1",
    "rollup": "^1.9.0",
    "rollup-plugin-copy": "^1.0.0",
    "rollup-plugin-typescript": "^1.0.1",
    "ts-jest": "^24.0.2",
    "tslib": "^1.9.3",
    "typescript": "^3.4.2"
  },
  "dependencies": {}
}

Идея состоит в том, что сборка создает app.js пакет, который считывает конфигурацию из config.json, который должен находиться в том же каталоге.

config.json:

{
    "greeting": "hi"
} 

Комплект app.js содержит:

var config = require('./config.json');

... и запуск app.js работает нормально (когда указано config.json), но когда я запускаю npm test (или просто npx jest) Jest-ошибки с:

 FAIL  __tests__/greeter.test.ts
  ● Test suite failed to run

    Cannot find module './config.json' from 'greeter.ts'

    However, Jest was able to find:
        '../src/modules/greeter.ts'

    You might want to include a file extension in your import, or update your 'moduleFileExtensions', which is currently ['js', 'json', 'jsx', 'ts', 'tsx', 'node'].

    See https://jestjs.io/docs/en/configuration#modulefileextensions-array-string

    > 1 | const config = require('./config.json')
        |                ^
      2 | const greeting = config.greeting;
      3 | console.log(greeting)
      4 | 

      at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:229:17)
      at Object.<anonymous> (src/modules/greeter.ts:1:16)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        1.03s
Ran all test suites.

Чтобы исправить эту ошибку, мне нужно оставить config.json (используется только для модульного тестирования) рядом с greeter.tssrc/modules), но я бы хотел оставить его в __tests__. Я попытался изменить moduleDirectories и modulePaths в файле конфигурации Jest, но безрезультатно.

Есть ли способ сделать config.json видимым для greeter.ts модуля при тестировании Jest, сохранив его видимость из пакета app.js во время выполнения?


person Bojan Komazec    schedule 09.04.2019    source источник
comment
у вас был обходной путь для этого?   -  person user2936008    schedule 04.03.2020


Ответы (1)


Краткий ответ: нет. Вы не можете требовать файл, которого не существует.

Более длинный ответ - мне непонятно, зачем вам это нужно. Ваш исходный код должен быть полным, независимо от структуры тестового файла. Вы бы не стали ссылаться на файл, которого не существует, что вы делаете, когда require('./config.json') из src/modules/greeter.ts, когда src/modules/config.json не существует.

Поэтому я бы рекомендовал переместить копию config.json в ваш modules каталог, а затем использовать beforeAll в вашем файле jest, если вам нужно, чтобы содержимое config.json отличалось для ваших целей тестирования.

Надеюсь это поможет!

person jmealy    schedule 18.08.2019