typescript - Denne filen behandles som en ES-modul fordi den har filendelsen '.js'
Jeg vil bruke jtest for å gjøre en enhetstest i typescript (Node versjon v16.13.2) prosjektet. Først installerer jeg jtest "jest": "^27.5.1" og legger til jest.config.js fil:
module.exports = {
roots: [
"<rootDir>/test"
],
testRegex: 'test/(.+)\\.test\\.(jsx?|tsx?)$',
transform: {
"^.+\\.tsx?$": "ts-jest"
},
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
};
Legg til testoppføringen:
import DeviceHandler from "@utils/data/DeviceHandler";
test('hello world test', () => {
let deviceId = DeviceHandler.getDeviceId();
expect(deviceId).toBe("xxxx");
});
Men når jeg kjører testkommandoen yarn test:
ReferenceError: module is not defined in ES module scope
This file is being treated as an ES module because it has a '.js' file extension and '/Users/dolphin/source/reddwarf/frontend/js-wheel/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
at file:///Users/dolphin/source/reddwarf/frontend/js-wheel/jest.config.js:1:1
at ModuleJob.run (node:internal/modules/esm/module_job:185:25)
at async Promise.all (index 0)
at async ESMLoader.import (node:internal/modules/esm/loader:281:24)
at async importModuleDynamicallyWrapper (node:internal/vm/module:437:15)
at async requireOrImportModule (/Users/dolphin/source/reddwarf/frontend/js-wheel/node_modules/jest-util/build/requireOrImportModule.js:65:32)
at async readConfigFileAndSetRootDir (/Users/dolphin/source/reddwarf/frontend/js-wheel/node_modules/jest-config/build/readConfigFileAndSetRootDir.js:132:22)
at async readConfig (/Users/dolphin/source/reddwarf/frontend/js-wheel/node_modules/jest-config/build/index.js:233:18)
at async readConfigs (/Users/dolphin/source/reddwarf/frontend/js-wheel/node_modules/jest-config/build/index.js:420:26)
at async runCLI (/Users/dolphin/source/reddwarf/frontend/js-wheel/node_modules/@jest/core/build/cli/index.js:132:59)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
(base)
Dette er innholdet i DeviceHandler.ts:
const DeviceHandler = {
getDeviceId: async() : Promise<string> => {
return new Promise((resolve, reject) => {
resolve("xxxx");
});
},
getDeviceIdEnhance: async (): Promise<string> => {
return new Promise((resolve, reject) => {
// Initialize an agent at application startup.
const fpPromise = require('@fingerprintjs/fingerprintjs').load();
// Get the visitor identifier when you need it.
fpPromise
.then((fp: { get: () => any; }) => fp.get())
.then(async (result: { visitorId: any; }) => {
// This is the visitor identifier:
const deviceId = result.visitorId;
resolve(deviceId);
});
});
}
};
export default DeviceHandler;
Hvorfor skjedde denne feilen? Hva bør jeg gjøre for å få enhetstesten til å fungere?
Svar #1
Du har sannsynligvis "type": "module" i package.json-filen din. Hvis du fjerner det, vil det fikse dette.
Alternativt, hvis du ønsker å beholde din "type": "module", kan du konvertere din jest.config.js til å være jest.config.json (og/eller hvis du har en babel.config.js, må du også konvertere den til babel.config.json). Merk at du faktisk må konvertere den til JSON-format (så, fjern module.exports= fra den, osv).
Dette eksempelet på prosjekt går mye mer i dybden på alt dette
Svar #2
Jeg støtte på denne feilen i dag og ønsket å beholde biblioteket mitt som "type": "module" i min package.json, så jeg endret min jest.config.js til jest.config.json som cmcculloh foreslår. Jeg måtte foreta endringer i filen for å tilpasse endringen.
jest.config.js:
/* eslint-disable */
module.exports = {
displayName: '@company/admin-lib',
preset: '../../../jest.preset.js',
transform: {
'^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nx/react/plugins/jest',
'^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nx/react/babel'] }],
},
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
coverageDirectory: '../../../coverage/packages/@company/admin-lib',
};Den tilsvarende jest.config.json ville være:
{
"displayName": "@company/admin-lib",
"preset": "../../../jest.preset.js",
"transform": {
"^(?!.*\\.(js|jsx|ts|tsx|css|json)$)": "@nx/react/plugins/jest",
"^.+\\.[tj]sx?$": ["babel-jest", { "presets": ["@nx/react/babel"] }]
},
"moduleFileExtensions": ["ts", "tsx", "js", "jsx"],
"coverageDirectory": "../../../coverage/packages/@company/admin-lib"
}
