Тестирование экспресс-конечных точек NodeJS с использованием супертеста - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь настроить тестовую среду для тестирования моих конечных точек машинописного экспресс-узла, но, похоже, я не могу заставить его работать. Я установил:

  1. jest
  2. ts-jest
  3. jest-junit
  4. supertest
  5. @ types / supertest
  6. @ types / jest

Вот как выглядит файл спецификации:

import * as request from 'supertest';
import seed from '../../modules/contract/seed'; //empty seed function
import app from '../../index'; // export default app which is an express()

beforeAll(seed);

describe('contractService', () => {
  it('getContracts ', async () => {
    const res = await request(app).get('/getContracts');
    console.log(res.body);
  });
  it('makeContract makes and returns a new contract', async () => {
    const res = await request(app)
      .post('/makeContract')
      .send({
        name: 'testContract',
        startDate: '2019-10-3',
        challenges: []
      });
    expect(res.statusCode).toEqual(200);
    expect(res.body.challenges).toEqual([]);
    expect(res.body.name).toEqual('testContract');
    expect(res.body.startDate).toContain('2019-10-3');
  });
});

По запросу (приложению) появляется сообщение о том, что

Это выражение не вызывается. Тип 'typeof supertest' не имеет сигнатур вызовов

contractService.spec.ts (1, 1): тип создается при этом импорте. Импорт в стиле пространства имен не может быть вызван или создан, что приведет к сбою во время выполнения. Попробуйте вместо этого использовать по умолчанию импорт или импорт require.

Я не знаю, что делать, потому что если я использую require вместо import, я получаю следующую ошибку

TypeError: Невозможно прочитать свойство 'address' из неопределенного

it('getContracts ', async () => {
     const res = await request(app)
       .get('/')
        ^
       .expect(200);
});

index.ts

import './config/environment';
import http, { Server } from 'http';
import express, { Express, Router } from 'express';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';
import connect from './database/index';
import patientRouter from './services/patientService';
import challengeRouter from './services/challengeService';
import contractRouter from './services/contractService';

let app: Express;

const startServer = async () => {
  try {
    await connect();
    app = express();
    const routes = Router();
    app.use(bodyParser.json());
    app.use(routes);
    // app.get('/', (req: Request, res: Response) => res.sendStatus(200));
    routes.get('/', (req, res) => res.send('OK'));
    // use routers from services
    routes.use('/', patientRouter);
    routes.use('/', challengeRouter);
    routes.use('/', contractRouter);
    const httpServer: Server = http.createServer(app);
    httpServer.listen(process.env.PORT, async () => {
      console.log(`? Server ready at http://localhost:${process.env.PORT}`);
    });
    const shutdown = async () => {
      await new Promise(resolve => httpServer.close(() => resolve()));
      await mongoose.disconnect();
      if (process.env.NODE_ENV === 'test') return;
      process.exit(0);
    };
    process.on('SIGTERM', shutdown);
    process.on('SIGINT', shutdown);
    process.on('SIGQUIT', shutdown);
  } catch (e) {
    console.log(e);
  }
};

startServer();

export default app;

Jest config:

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  testMatch: ['<rootDir>/**/__tests__/**/*.spec.ts'],
  testPathIgnorePatterns: ['/node_modules/'],
  coverageDirectory: './test-reports',
  coveragePathIgnorePatterns: ['node_modules', 'src/database', 'src/test', 'src/types'],
  reporters: ['default', 'jest-junit'],
  globals: { 'ts-jest': { diagnostics: false } }
};

1 Ответ

0 голосов
/ 18 октября 2019

В асинхронном тесте вам нужно вызвать функцию done () следующим образом:

Также необходимо выполнить импорт с помощью require.

Вы можете попробовать этот код?

const seed = require("../../modules/contract/seed"); //empty seed function
const app = require("../../index"); // export default app which is an express()

const request = require("supertest");

beforeAll(seed);

describe("contractService", () => {
  it("getContracts ", async done => {
    const res = await request(app).get("/getContracts");
    expect(res.status).toBe(200);
    done();
  });

  it("makeContract makes and returns a new contract", async done => {
    const res = await request(app)
      .post("/makeContract")
      .send({
        name: "testContract",
        startDate: "2019-10-3",
        challenges: []
      });
    expect(res.statusCode).toEqual(200);
    expect(res.body.challenges).toEqual([]);
    expect(res.body.name).toEqual("testContract");
    expect(res.body.startDate).toContain("2019-10-3");
    done();
  });
});

...