Почему Jest использует для тестирования комплект веб-пакетов, а не исходные файлы? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть странная ошибка в тесте Jest, которая (по крайней мере, для меня) внезапно появилась в проекте, который я раньше мог тестировать без проблем.

У меня есть следующий макет:

├── dist
│   └── main.bundle.js
├── .babelrc
├── jest.config.js
├── package.json
├── package-lock.json
├── setupTests.js
├── src
│   └── index.ts
├── test
│   ├── main.test.ts
│   ├── testInput.json
│   └── testOutput.json
├── webpack.config.js
└── tsconfig.json

В моем main.test.ts у меня есть:

beforeEach(() => {
  const foo = new Foo({
    inputData: require("./testInput.json"),
  });
});

Когда я запускаю npx jest, я получаю:

Cannot find module './testInput.json' from 'main.test.js'

Я обнаружил, что причина в том, что main.bundle.js файл устарел. Таким образом, единственный способ заставить тесты работать:

  1. Удаление каталога dist или
  2. Запуск сборки с веб-пакетом

Почему это так? Почему Jest ищет встроенный пакет, а не просто работает с исходными файлами?


Вот мой tsconfig.json:

{
    "compilerOptions": {
        "outDir": "./dist/",
        "noImplicitAny": true,
        "module": "es6",
        "target": "es5",
        "jsx": "react",
        "allowJs": true,
        "sourceMap": true,
    }
}

Я использую TypeScript 3.8.3 и Шутка 25.4.0.

В моем jest.config.js у меня есть:

const {defaults} = require('jest-config');
module.exports = {
  setupFilesAfterEnv: ['<rootDir>/setupTests.js'], // this only includes "import 'regenerator-runtime/runtime';"
  transform: {
    '^.+\\.[t|j]sx?$': 'babel-jest'
  }
};

И в моем .babelrc:

{
  "env": {
    "test": {
      "plugins": [
        "@babel/plugin-transform-modules-commonjs"
      ]
    }
  },
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "6.10",
          "esmodules": true
        }
      }
    ],
    "@babel/typescript"
  ],
  "plugins": [
    "@babel/plugin-proposal-object-rest-spread",
    "@babel/plugin-proposal-class-properties"
  ]
}

И в webpack.config.js :

const path = require("path");

module.exports = {
  entry: path.resolve(__dirname, "src", "index.ts"),
  devtool: "inline-source-map",
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: "ts-loader",
        exclude: /node_modules/,
      },
    ],
  },
  resolve: {
    extensions: [".tsx", ".ts", ".js"],
    alias: {
      "@": __dirname,
      src: path.resolve(__dirname, "src"),
    },
  },
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "main.bundle.js",
  },
  optimization: {
    minimize: false,
  },
  stats: {
    colors: true,
  },
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...