Javascript 在使用Mocha测试TypeScript时,默认值不是构造函数

Javascript 在使用Mocha测试TypeScript时,默认值不是构造函数,javascript,typescript,testing,mocha.js,Javascript,Typescript,Testing,Mocha.js,我正在尝试使用mocha进行单元测试。我使用的是typescript,它可以通过tsc编译成纯javascript。我总是会遇到这样的错误: src\index.ts:22 [new FrontendEndpoint(), ...], ^ TypeError: v1_1.default is not a constructor 我采用了两种方法(并两次遇到相同的问题): 首先,我创建了一个虚拟测试test.test.ts,为测试目的导入了一些模

我正在尝试使用mocha进行单元测试。我使用的是typescript,它可以通过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();
        });
    });

  • 使用ts摩卡

    • 已安装ts摩卡、摩卡、@types/mocha
    • 运行
      ts摩卡src/test/test.test.ts
  • 使用mocha&编译的ts文件

    • 已安装摩卡咖啡,@types/mocha
    • Ran
      mocha build/test/test.test.js
  • 这两种方法都会产生上述错误

    index.ts
    如下所示:

    
        import FrontendEndpoint from './api/endpoints/frontend/v1';
        [...]
        new FrontendEndpoint()
    
    
    {
        "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"
        ],
    }
    
    已编译(index.js):

    前端/v1.ts

    
        export default class FrontendEndpoint {
            [...]
        }
    
    
    已编译(v1.js):

    我的tsconfig如下所示:

    
        import FrontendEndpoint from './api/endpoints/frontend/v1';
        [...]
        new FrontendEndpoint()
    
    
    {
        "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应用程序时,我遇到了同样的问题。我完全错过了什么吗?

    我自己找到了解决办法

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


    在使用并解决这些循环后,运行测试工作正常。

    我自己找到了解决方案

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


    在找到使用并解决这些循环后,运行测试工作正常。

    其他人提到了默认导入的问题,并在前几天开玩笑。。。嗯。
    frontend/v1.ts
    :…
    exports.default=frontendpoint;
    “如果答案显而易见,我不是一个打字高手,但为什么不导出默认frontendpoint呢?”?导入时使用ESM语法,导出时使用CommonJS语法…?我可能有点不清楚。这是从typescript编译的javascript。这是typescript编译器处理默认导出的方式。您说*”,然后是
    frontend/v1.ts:
    ,后面是代码。所以我自然地认为这是
    frontend/v1.ts
    中的代码。在编辑时,我不知道该代码是什么。请您同时显示导出的typescript和带有清晰标签的JavaScript,好吗(就像你对
    index.ts
    所做的那样)。当然,对不起。我添加了源代码。其他人提到了默认导入的问题,并在前几天开玩笑……嗯。”还有
    frontend/v1.ts
    :…
    exports.default=frontendpoint;
    "抱歉,如果答案很明显,我不是一个大的TypeScript人,但是为什么不
    导出默认FrontEndpoint;
    ?导入时使用ESM语法,导出时使用CommonJS语法…?我可能有点不清楚。这是从TypeScript编译的javascript。这是TypeScript编译器处理默认导出的方式。你说:d*“和
    frontend/v1.ts:
    后面跟着代码。所以我自然地认为那是
    frontend/v1.ts
    中的代码。编辑后,我不知道那是什么代码。请您显示导出的类型脚本和JavaScript,清楚地标记(就像您使用
    index.ts
    时那样)。当然,对不起。我添加了源代码。