Как импортировать файл конфигурации, чтобы его можно было найти как по встроенному комплекту, так и по модулю при тестировании Jest? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть проект 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 / модули / greeter.ts:

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

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

__ __ тесты / 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": {}
}

Идея состоит в том, что build создает пакет 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 во время выполнения?

...