【发布时间】: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();
});
});
-
使用 ts-mocha
- 已安装 ts-mocha、mocha、@types/mocha
- 跑
ts-mocha src/test/test.test.ts
-
使用 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