javascript - Jest vägrar att tolka JSX trots att tsconfig inkluderar `jsx`-alternativet


Jag försöker testa React-komponenter skrivna i TypeScript med Jest, men när jag kör testerna får jag detta fel:

Cannot use JSX unless the '--jsx' flag is provided.

Detta projekt behöver flera tsconfig-filer (en för en Node-server och en annan för klientkoden), så projektet är strukturerat på följande sätt:

/root
  package.json
  jest.config.js
  /src
    tsconfig.json
  /server
    tsconfig.json

Jag försöker för närvarande bara köra tester i src-katalogen. Jag tror att problemet är att ts-jest inte laddar rätt tsconfig-fil, men efter att ha bläddrat igenom deras dokumentation, problem och frågat på Slack-kanalen, kan jag inte hitta något sätt att antingen skicka --jsx-flaggan till ts-jest eller specificera vilken tsconfig som ska användas.

Här är innehållet i mina konfigurationsfiler:

/root/jest.config.js

module.exports = {
  roots: [
    '<rootDir>/src',
  ],
  transform: {
    '^.+\\.tsx?$': 'ts-jest',
  },
  testRegex: '/__tests__/.*\\.test\\.tsx?$',
  moduleFileExtensions: [
    'ts',
    'tsx',
    'js',
    'jsx',
    'json',
    'node',
  ],
  setupFilesAfterEnv: ['jest-enzyme'],
  testEnvironment: 'enzyme',
};

/root/src/tsconfig.json

{
  "compilerOptions": {
    "plugins": [
      {
        "name": "typescript-styled-plugin"
      }
    ],
    "target": "es2018",
    "lib": ["es2018", "dom"],
    "jsx": "react",
    "moduleResolution": "node",
    "allowJs": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "sourceMap": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "noImplicitReturns": true,
    "outDir": "../dist/src",
    "baseUrl": ".",
    "typeRoots": ["./types", "../node_modules/@types"]
  }
}

Och mina relevanta beroenden i package.json

"@types/jest": "^24.0.10",
"@types/enzyme": "^3.9.0",
"enzyme": "^3.9.0",
"enzyme-adapter-react-16": "^1.10.0",
"jest": "^24.3.1",
"jest-environment-enzyme": "^7.0.2",
"jest-enzyme": "^7.0.2",
"ts-jest": "^24.0.0",
"ts-node": "^8.0.2",
"typescript": "^3.3.3",
"typescript-styled-plugin": "^0.13.0"

Och testet som misslyckas (placerat på /root/src/pages/__tests__/index.test.tsx)

import React from 'react';
import IndexPage from '../index';
import { shallow } from 'enzyme';

describe('pages/index', () => {
  test('Should render without error', () => {
    const wrapper = shallow(<IndexPage/>);
  });
});

Vad gör jag för fel här?

REDIGERA:

Jag har fått det att fungera under tiden genom att helt enkelt flytta root/src/tsconfig.json till root/tsconfig.json. Detta kommer inte att fungera om jag någonsin vill lägga till tester till servern, men jag kommer att använda det tills något bättre dyker upp.

Svar #1

ts-jest kommer som standard att leta efter <roodDir>/tsconfig.json.

Om du vill ange en specifik konfigurationsfil, använd alternativet global/ts-jest/tsconfig:

//  package.json/jest or jest.config.json
{
  "globals": {
    "ts-jest": {
      "tsConfig": "<your tsconfig.json file path>"
    }
  }
}

Referens: https://kulshekhar.github.io/ts-jest/user/config/#options

Relaterade artiklar