Typescript、Express、Mocha 和 Chai 测试时出错
Typescript, Express, Mocha & Chai Error while testing
我在 typescript 中使用 express 创建了我的第一个服务器,它运行良好
import app from './Server'
const server = app.listen(8080, '0.0.0.0', () => {
console.log("Server is listening on standard port 80...");
});
export default server;
现在我尝试测试存储在应用程序中的路线:
import express from 'express';
import * as bodyParser from "body-parser";
const app = express();
app.use(bodyParser.json());
app.get("/", (req: express.Request, res: express.Response) => {
res.status(200).send("SUCCESS");
});
export default app;
使用这个测试:
import * as chai from 'chai';
import chaiHttp = require('chai-http');
chai.use(chaiHttp);
import server from '../src';
describe("LogAPI", () => {
describe('Base express tests', () => {
it("Should return 'SUCCESS' if GET /", async () => {
return chai.request(server).get("/").then(res => {
chai.expect(res.body).to.equal("SUCCESS");
})
});
it("Should return status-code 200 by calling GET /", async () => {
return chai.request(server).get("/").then(res => {
chai.expect(res.status).to.equal(200);
})
});
});
});
但即使在 运行 服务器本身工作时,用
开始测试
mocha --require ts-node/register ./../test/**/*.ts
抛出这个错误:
/Users/.../NotificationService/src/Server/index.js:5
var app = express_1.default();
^
TypeError: express_1.default is not a function
at Object. (/Users/.../NotificationService/src/Server/inde> x.js:5:28)
我正在使用 es6 目标和 commonjs 模块。
如何正确测试我的服务器?
更新 1
我现在摆弄了一下,结果发现从编译代码中删除 default()
方法解决了一些问题。
现在,我得到
/Users/.../NotificationService/test/node_modules/@types/chai-http/index.d.ts:13
import * as request from 'superagent';
SyntaxError: Unexpected token import
更新 2
我的 ts-config.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./../out“,
"strict": true,
"esModuleInterop": true
}
}
您正在尝试从 express
进行默认导入,但该模块使用导出分配。将 import express from 'express';
替换为 import express = require('express');
或在 tsconfig.json
.
中将 esModuleInterop
编译器选项设置为 true
与express相关的错误是因为express没有使用默认导出,所以正确的做法是
// src.js
import * as express from 'express'
不要忘记安装类型定义,以便 Typescript 可以顺利编译它,例如
npm install @types/express --save-dev
npm install @types/body-parser --save-dev
npm install @types/chai-http --save-dev
更新:
我在本地用这个 tsconfig.json
试过了
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"types": [
"node",
"mocha",
"express"
],
"target": "es5",
"lib": [
"es2015"
],
...
},
}
使用默认导出有警告,如中所述
https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
希望对您有所帮助
答案是不使用单独的 package.json 和 tsconfig.json 文件。感谢 deerawan,我现在使用
- tsconfig.json
- package.json
- src/
- index.ts
- test/
- test.ts
这解决了问题!
我在 typescript 中使用 express 创建了我的第一个服务器,它运行良好
import app from './Server'
const server = app.listen(8080, '0.0.0.0', () => {
console.log("Server is listening on standard port 80...");
});
export default server;
现在我尝试测试存储在应用程序中的路线:
import express from 'express';
import * as bodyParser from "body-parser";
const app = express();
app.use(bodyParser.json());
app.get("/", (req: express.Request, res: express.Response) => {
res.status(200).send("SUCCESS");
});
export default app;
使用这个测试:
import * as chai from 'chai';
import chaiHttp = require('chai-http');
chai.use(chaiHttp);
import server from '../src';
describe("LogAPI", () => {
describe('Base express tests', () => {
it("Should return 'SUCCESS' if GET /", async () => {
return chai.request(server).get("/").then(res => {
chai.expect(res.body).to.equal("SUCCESS");
})
});
it("Should return status-code 200 by calling GET /", async () => {
return chai.request(server).get("/").then(res => {
chai.expect(res.status).to.equal(200);
})
});
});
});
但即使在 运行 服务器本身工作时,用
开始测试mocha --require ts-node/register ./../test/**/*.ts
抛出这个错误:
/Users/.../NotificationService/src/Server/index.js:5 var app = express_1.default(); ^ TypeError: express_1.default is not a function at Object. (/Users/.../NotificationService/src/Server/inde> x.js:5:28)
我正在使用 es6 目标和 commonjs 模块。 如何正确测试我的服务器?
更新 1
我现在摆弄了一下,结果发现从编译代码中删除 default()
方法解决了一些问题。
现在,我得到
/Users/.../NotificationService/test/node_modules/@types/chai-http/index.d.ts:13 import * as request from 'superagent'; SyntaxError: Unexpected token import
更新 2 我的 ts-config.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./../out“,
"strict": true,
"esModuleInterop": true
}
}
您正在尝试从 express
进行默认导入,但该模块使用导出分配。将 import express from 'express';
替换为 import express = require('express');
或在 tsconfig.json
.
esModuleInterop
编译器选项设置为 true
与express相关的错误是因为express没有使用默认导出,所以正确的做法是
// src.js
import * as express from 'express'
不要忘记安装类型定义,以便 Typescript 可以顺利编译它,例如
npm install @types/express --save-dev
npm install @types/body-parser --save-dev
npm install @types/chai-http --save-dev
更新:
我在本地用这个 tsconfig.json
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"types": [
"node",
"mocha",
"express"
],
"target": "es5",
"lib": [
"es2015"
],
...
},
}
使用默认导出有警告,如中所述 https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
希望对您有所帮助
答案是不使用单独的 package.json 和 tsconfig.json 文件。感谢 deerawan,我现在使用
- tsconfig.json
- package.json
- src/
- index.ts
- test/
- test.ts
这解决了问题!