【问题标题】:Run mocha with Typescript throws: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"使用 Typescript 运行 mocha 时抛出:TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension \".ts\"
【发布时间】:2022-10-21 17:02:18
【问题描述】:

我正在尝试使用 Typescript 和 Mocha 编写一些测试。

按照它的文档,我最终得到了以下设置:

包.json

{
//...
  "scripts": {
    "test": "mocha",
  },
//...
}

.mocharc.json

{
  "extension": ["test.ts"],
  "spec": "tests/*.test.ts",
  "require": "ts-node/register",
  "recursive": true
}

tsconfig.json

{
    "compilerOptions": {
        "outDir": "dist",
        "module": "commonjs",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "sourceMap": false,
        "strict": true,
        "esModuleInterop": true,
        "isolatedModules": true,
    },
    "files": [
        "src/main/main.ts",
    ],
}

运行 npm test 会引发以下错误:TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for [...]/tests/task.test.ts

这是我唯一的测试,直到我导入单独的 .ts 文件 (../src/core/task) 之前它都有效,以确保完整性:

任务.test.ts

import { assert } from 'chai';
import { Task } from '../src/core/task';

describe('Task', () => {
    it('Task Run', () => {
        const task = new Task({
            title: "My Title",
            command: "echo hello",
            path: "."
        });
        
        task.run();
    })
});

我根据其他一些答案以及ts-mocha 尝试了我的配置的几种排列,但没有成功。

【问题讨论】:

  • 在摆弄了一会儿之后,我注意到问题是 core/task 正在导入的仅限 ESM 的库。为了使它工作,我似乎需要将项目移植到 ESM。不确定是否有更简单的选择

标签: node.js typescript mocha.js


【解决方案1】:

我在 ts-node@9 中工作之前遇到了同样的问题,但在 ts-node@10 中没有,然后我在.mocharc.json 中尝试了此配置以使其按预期工作

{
  "extensions": ["ts"],
  "spec": ["**/*.spec.*"],
  "node-option": [
    "experimental-specifier-resolution=node",
    "loader=ts-node/esm"
  ]
}

【讨论】:

  • 我有同样的问题。我是 mocha 单元测试的新手,我有点困惑。 mocha lib 文件夹中有一个 mocharc.json 文件。你是修改那个文件还是在你的项目中创建一个新文件?谢谢你。
  • @Patricia 你可以在你的项目根目录中创建新文件.mocharc.json,你可以检查我是如何在这个 repo 中使用它的github.com/point-hub/express-factory/tree/v1.1.0
【解决方案2】:

就我而言,问题是由 TypeScript 测试文件导入的 JS 文件中的 import 引起的。将其转换为 require 可以解决问题。

一般来说,当异常发生在:

Loader.defaultGetFormat [as _getFormat] internal/modules/esm/get_format.js

只有一种解释:Node.js 正在使用它的 ESM 加载器来加载应该由ts-node 转译的代码。

所以修复应该始终是 - 找到 Node.js 切换到 ESM 的原因并消除它。

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 2022-07-23
    • 2020-08-15
    • 2022-11-04
    • 1970-01-01
    • 2017-05-18
    • 2017-08-02
    • 2022-10-17
    • 2020-08-05
    相关资源
    最近更新 更多