Typescript, Express, Mocha & Chai Ошибка при тестировании

Я сделал свой первый сервер, используя экспресс в машинописном тексте, и он отлично работает

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 не является функцией объекта. (/ Пользователи /.../ 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: неожиданный импорт токена

Обновление 2 Мой ts-config.json:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs", 
    "outDir": "./../out“,
    "strict": true,
    "esModuleInterop": true   
  }
}

person Coding Vampyre    schedule 19.09.2018    source источник


Ответы (3)


Ошибка, связанная с экспрессом, заключается в том, что экспресс не использует экспорт по умолчанию, поэтому правильный способ

// 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

Надеюсь, это поможет

person deerawan    schedule 21.09.2018
comment
Спасибо за ответ. Я пытался сделать это с самого начала, но изменение моего импорта привело к > error TS2497: Module '"/Users/.../NotificationService/test/node_modules/@types/chai-http/index"' resolves to a non-module entity and cannot be imported using this construct. - person Coding Vampyre; 21.09.2018
comment
И используя этот импорт для экспресс-результата в error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'typeof e' has no compatible call signatures. 4 const app = express(); - person Coding Vampyre; 21.09.2018
comment
моя беда, chai-http очевидно, не может использоваться с import. Пробовал локально. Мне действительно интересно узнать о вашем экспрессе. Я пытался воспроизвести это, но не смог. Вы можете разместить свой tsconfig.json? - person deerawan; 21.09.2018
comment
Я обновил свой вопрос, чтобы включить его. Я также могу загрузить весь проект, за исключением node_modules, если хотите. - person Coding Vampyre; 21.09.2018
comment
@CodingVampyre Спасибо. Попробуйте удалить свой esModuleInterop из tsconfig.json. Использование этого параметра не позволяет использовать синтаксис import * as ... from ... - person deerawan; 21.09.2018
comment
Я думаю, что к чему-то добрался. Теперь import * as express from 'express'; работает, компиляция тоже работает, но тест npm теперь выдает /.../NotificationService/test/node_modules/@types/body-parser/index.d.ts:14 import { NextHandleFunction } from 'connect'; SyntaxError: Unexpected token import - person Coding Vampyre; 21.09.2018
comment
@CodingVampyre, это хорошо. Какая у вас версия машинописного текста? а что содержит npm test? - person deerawan; 21.09.2018
comment
Typescript имеет версию 3.0.3, тест npm запускается mocha --require ts-node/register ./../test/**/*.ts из папки src. - person Coding Vampyre; 21.09.2018
comment
Позвольте нам продолжить это обсуждение в чате. - person deerawan; 21.09.2018

Вы пытаетесь выполнить импорт по умолчанию из express, но модуль использует назначение экспорта. Либо замените import express from 'express'; на import express = require('express');, либо установите для параметра компилятора esModuleInterop значение true в tsconfig.json.

person Matt McCutchen    schedule 20.09.2018
comment
Я сделал и то, и другое, но ошибка осталась, и в поведении ничего не изменилось. Сервер по-прежнему работает нормально, но тестирование по-прежнему приводит к ошибке, указанной выше. - person Coding Vampyre; 20.09.2018

Ответ заключался в том, чтобы не использовать отдельные файлы package.json и tsconfig.json. Благодаря диравану, теперь я использую

- tsconfig.json
- package.json
- src/
    - index.ts
- test/
    - test.ts

что решает проблему!

person Coding Vampyre    schedule 21.09.2018