У меня есть странная ошибка в тесте 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
файл устарел. Таким образом, единственный способ заставить тесты работать:
- Удаление каталога
dist
или - Запуск сборки с веб-пакетом
Почему это так? Почему 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,
},
};