Typescript, Express, Mocha și Chai Eroare în timpul testării
Am creat primul meu server folosind Express în TypeScript și funcționează perfect
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;
Acum încerc să testez rutele stocate în aplicație:
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;
Folosind acest test:
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);
})
});
});
});
Dar chiar și atunci când serverul funcționează, pornind testul cu
mocha --require ts-node/register ./../test/**/*.ts
îmi aruncă această eroare:
/Users/.../NotificationService/src/Server/index.js:5 var app=express_1.default(); ^ TypeError: express_1.default nu este o funcție la Object. (/Users/.../NotificationService/src/Server/index.js:5:28)
Folosesc target ES6 și modul commonjs. Cum pot să testez corect serverul meu?
Actualizare 1 Am mai experimentat puțin și s-a dovedit că ștergerea metodei default() din codul compilat a rezolvat ceva.
Acum, înțeleg
/Users/.../NotificationService/test/node_modules/@types/chai-http/index.d.ts:13 import * as request from 'superagent'; SyntaxError: Token neașteptat import
Actualizare 2 Fișierul meu ts-config.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./../out“,
"strict": true,
"esModuleInterop": true
}
}
Răspuns #1
Eroarea legată de express apare pentru că express nu folosește exportul implicit, deci modul corect este
// src.js
import * as express from 'express'
Nu uita să instalezi definițiile de tip astfel încât Typescript să le poată compila fără probleme, cum ar fi
npm install @types/express --save-dev
npm install @types/body-parser --save-dev
npm install @types/chai-http --save-dev
Actualizat: Am încercat local cu acest tsconfig.json
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"types": [
"node",
"mocha",
"express"
],
"target": "es5",
"lib": [
"es2015"
],
...
},
}
Folosirea exportului implicit are un dezavantaj, așa cum este descris în https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html
Sper că ajută
Răspuns #2
Încercați să faceți un import implicit din express, dar modulul folosește o atribuție de export. Înlocuiți fie import express from 'express'; cu import express=require('express');, fie setați opțiunea de compilator esModuleInterop la true în tsconfig.json.
