..._1.default 在使用 Mocha 测试 TypeScript 时不是构造函数
..._1.default is not a constructor when testing TypeScript with Mocha
我正在尝试使用 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
的应用程序一切正常时,默认 exports/imports 按预期工作。
我在尝试使用 Webpack、Mocha 和 Jest 向我的前端 React 应用程序添加单元测试时遇到了同样的问题。我是否完全错过了什么?
我自己找到了解决方案。
调试我的测试时,我发现有些导出没有被调用。这是由于文件的 循环依赖性 导致它们无法正确导出。
在使用 https://github.com/pahen/madge 找到这些循环并解决它们之后,运行 测试工作正常。
我正在尝试使用 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
的应用程序一切正常时,默认 exports/imports 按预期工作。
我在尝试使用 Webpack、Mocha 和 Jest 向我的前端 React 应用程序添加单元测试时遇到了同样的问题。我是否完全错过了什么?
我自己找到了解决方案。
调试我的测试时,我发现有些导出没有被调用。这是由于文件的 循环依赖性 导致它们无法正确导出。
在使用 https://github.com/pahen/madge 找到这些循环并解决它们之后,运行 测试工作正常。