Typescript, Express, Mocha & Chai Ошибка при тестировании - PullRequest
0 голосов
/ 19 сентября 2018

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

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 не является функцией в Object.(/ Users /.../ NotificationService / src / Server / inde> x.js: 5: 28)

Я использую модуль es6 target и commonjs.Как правильно проверить мой сервер?

Обновление 1 Теперь я немного повозился, и оказалось, что удаление метода default() из скомпилированного кода разрешило что-то.

Теперь я получаю

/ Users /.../ NotificationService/test/node_modules/@types/chai-http/index.d.ts: 13 import * как запрос от 'superagent';Ошибка синтаксиса: неожиданный импорт токена

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

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

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

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

// src.js
import * as express from 'express'

Не забудьте установить определения типов, чтобы Typescript мог плавно скомпилировать их, например, * 1004.*

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

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

0 голосов
/ 21 сентября 2018

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

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

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

0 голосов
/ 20 сентября 2018

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

...