【问题标题】:..._1.default is not a constructor when testing TypeScript with Mocha..._1.default 在使用 Mocha 测试 TypeScript 时不是构造函数
【发布时间】:2019-06-06 09:50:28
【问题描述】:

我正在尝试使用 mocha 进行单元测试。我正在使用打字稿,它被编译成带有 tsc 的纯 javascript。我总是收到错误:

    src\index.ts:22
        [new FrontendEndpoint(), ...],
         ^
    TypeError: v1_1.default is not a constructor

我采用了两种方法(两次遇到同样的问题):

首先我创建了一个虚拟测试test.test.ts,导入我的一些模块用于测试目的:


    import { APIServer } from './../api/index';
    import { describe } from 'mocha';
    import FrontendEndpoint from '../api/endpoints/frontend/v1';
    import { SocketConnector } from '../api/sockets/socketio';

    describe('TestTest', () => {
        it('should run', (done) => {
            const server = new APIServer(4000, [new FrontendEndpoint()], new SocketConnector([]));
            done();
        });
    });

  1. 使用 ts-mocha

    • 已安装 ts-mocha、mocha、@types/mocha
    • ts-mocha src/test/test.test.ts
  2. 使用 mocha 和编译的 ts 文件

    • 已安装 mocha,@types/mocha
    • mocha build/test/test.test.js

两种方式都会产生上述错误。

index.ts 看起来像这样:


    import FrontendEndpoint from './api/endpoints/frontend/v1';
    [...]
    new FrontendEndpoint()

已编译(index.js):


    [...]
    const v1_1 = require("./api/endpoints/frontend/v1");
    [...]
    new v1_1.default()

还有frontend/v1.ts:


    export default class FrontendEndpoint {
        [...]
    }

已编译(v1.js):


    class FrontendEndpoint {
        [...]
    }
    exports.default = FrontendEndpoint;

我的 tsconfig 如下所示:

{
    "compilerOptions": {
        "target": "es2015",
        "module": "commonjs",
        "moduleResolution": "node",
        "sourceMap": true,
        "noImplicitReturns": true,
        "noImplicitAny": true,
        "preserveConstEnums": true,
        "strictPropertyInitialization": false,
        "experimentalDecorators": true,
        "typeRoots": [
            "src/types"
        ],
        "emitDecoratorMetadata": true,
        "sourceRoot": "src",
        "outDir": "build"
    },
    "compileOnSave": true,
    "exclude": [
        "node_modules",
        "coverage",
        "build",
        "logs"
    ],
}

似乎只有默认导出存在问题。 为什么它们没有按预期工作?当使用 node build/index.js 运行应用程序时一切正常,默认导出/导入按预期工作。

在尝试使用 Webpack、Mocha 和 Jest 向我的前端 React 应用程序添加单元测试时,我遇到了同样的问题。我是否完全错过了什么?

【问题讨论】:

  • 前几天有人提到了默认导入和 Jest 的问题......嗯。
  • "And the frontend/v1.ts: ... exports.default = FrontendEndpoint;" 抱歉,如果答案很明显,我不是 TypeScript 大佬,但为什么不是 @987654336 @?您正在使用 ESM 语法进行导入,但 CommonJS 语法用于导出...?
  • 我可能让这有点不清楚。这是从打字稿编译的 javascript。这就是 typescript 编译器处理默认导出的方式。
  • 你说 *" 和 frontend/v1.ts: 后跟代码。所以我很自然地认为那是 frontend/v1.ts 中的代码。通过编辑,我不知道那个代码是什么。请你显示用于导出的 TypeScript 和 JavaScript,都带有清晰的标签(就像你对 index.ts 所做的那样)。
  • 当然,抱歉。我添加了源代码。

标签: javascript typescript testing mocha.js


【解决方案1】:

我自己找到了解决方案。

在调试我的测试时,我发现一些导出没有被调用。这是由于文件的循环依赖,导致它们无法正确导出。

使用https://github.com/pahen/madge 找到这些循环并解决它们后,运行测试就可以正常工作了。

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 2019-12-09
    • 1970-01-01
    • 2019-11-27
    • 2022-06-11
    • 2020-03-30
    • 2021-06-20
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多