簡體   English   中英

為什么 jest 在嘗試將 ts 文件用作自定義 testEnvironment 時會拋出 ERR_UNKNOWN_FILE_EXTENSION?

[英]Why does jest throw an ERR_UNKNOWN_FILE_EXTENSION when trying to use a ts file as custom testEnvironment?

我正在將我的 TypeScript 項目切換到 (pnpm) monorepo,並且無法讓測試正常運行。 我有一個 jest.config.js,它使用了一個用 TypeScript 編寫的自定義testEnvironment 但是,自從我將特定項目移動到我的包目錄中以進行 monorepo 重組后,jest 拋出一個錯誤並且不運行任何測試:

    TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for C:\workspaces\repos\the-monorepo\packages\testproject\source\testtools\jsdom-environment-global.spec.ts

我用@swc/jest 和 ts-jest 試過了,看看How to use TypeScript in a Custom Test Environment file in Jest? (這讓我想“為什么這會奏效?”)而且,無論出於何種原因,它昨天運行良好。 我清理了 jest 緩存並重新安裝了所有 node_modules 無濟於事。 我還在 package.json 中找到了與"type": "module"相關的答案,但這不適用於我的包。 這不是 ESM。

這是 jest.config.js 的樣子:

/** @type {import('@jest/types').Config.InitialOptions} */
const config = {
    silent: true,
    testEnvironment: "<rootDir>/source/testtools/jsdom-environment-global.spec.ts",
    roots: [
        "<rootDir>/source"
    ],
    maxWorkers: "50%",
    transform: {
        "^.+\\.(t|j)s$": ["@swc/jest", {
            sourceMaps: "inline",
            module: {
                strict: false,
                strictMode: false
            },

            jsc: {
                target: "es2021",
                parser: {
                    syntax: "typescript",
                    dynamicImport: true
                }
            }
        }]
    },
    transformIgnorePatterns: [
        "node_modules"
    ],
    testMatch: [
        "**/*/*.spec.ts",
        "**/*/*.test.ts",
        "!**/playwright-tests/**",
        "!**/playwright-tests-smoke/**"
    ],
    moduleFileExtensions: ["ts", "js", "node", "json"],
    reporters: [
        "default"
    ],
    globals: {
        self: {},
        navigator: {},
        jasmine: {},
        __UNIT__: true
    },
    coverageDirectory: "test-results",
    collectCoverage: false,
    collectCoverageFrom: [
        "./source/**/*.ts"
    ],
    coveragePathIgnorePatterns: [
        "/\\.spec\\.ts$/i",
        "/.*node_modules.*/",
        "/.*testtools.*/"
    ],
    coverageReporters: [
        "lcov", "cobertura"
    ],
    coverageProvider: "v8",
    resetMocks: true,
    restoreMocks: true,
    resetModules: true,
    setupFilesAfterEnv: [
        "jest-extended/all",
        "<rootDir>/source/testtools/setup.spec.ts"
    ],
    testPathIgnorePatterns: [
        "<rootDir>/source/testtools/",
        "<rootDir>/source/smoke-tests/",
        "<rootDir>/source/performance-tests/",
        "<rooDir>/source/playwright-tests/",
        "<rooDir>/source/playwright-tests-smoke/"
    ],
    moduleNameMapper: {
        "^@test-helpers": "<rootDir>/source/testtools/index.spec.ts",
        "^@test-tools/(.*)": "<rootDir>/source/testtools/$1",
        '^(\\.{1,2}/.*)\\.js$': '$1'
    }
};
module.exports = config;

如果它是 TypeScript 文件,為什么 jest 無法解析testEnvironment

我發現了問題:未將轉換器應用於 ESM 文件似乎有些混亂。 在我的例子中, jsdom-environment-global.spec.ts從我的 monorepo 中的不同包中導入了一個 ESM 模塊。 這個導入觸發了一個異常,因為 jest tris 通過require()導入它,它被捕獲,然后通過動態導入再次導入。 這個動態導入然后拋出ts是未知異常的異常。 我不確定為什么這些文件沒有被轉換,但是關於How to use TypeScript in a Custom Test Environment file in Jest? 這似乎很正常。

底線:不要從您開玩笑的testEnvironment模塊中的 ESM 文件導入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM