Запускать и останавливать сервер с помощью супертеста

У меня есть следующий класс сервера:

import express, { Request, Response } from 'express';

export default class Server {
  server: any;

  exp: any;

  constructor() {
    this.exp = express();
    this.exp.get('/', (_req: Request, res: Response) => {
      res.json('works');
    });
  }

  start(): void {
    this.server = this.exp.listen(3000);
  }

  stop(): void {
    this.server.close();
  }
}

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

Это легко сделать, используя beforAll и afterAll, где я могу только один раз создать экземпляр класса Server и вызвать методы start и close.

Но поскольку у меня есть более 10 контроллеров для тестирования, я хочу избежать запуска и остановки сервера во время каждого тестового файла.

Я нашел в документации setupFiles и setupFilesAfterEnv, но не могу остановить сервер, так как экземпляр не является "общим" в двух файлах.

Это пример 1 тестового файла:

import supertest from 'supertest';

describe('Album Test', () => {
   let app: App;

   beforeAll(async (done) => {
     app = new App();

     await app.setUp(); // database connection (not mentionned in the preivous example)
     done();
   });

   afterAll(async (done) => {
     await app.close();

     app.server.stop();
     done();
   });

  const api = supertest('http://localhost:3000');

  it('Hello API Request', async () => {
    const result = await api.get('/v1/user');
    expect(result.status).toEqual(200);
    ...
  });
});

Это прекрасно работает, но я дублирую эти методы beforeAll и afterAll в каждом тестовом файле. Есть ли способ объявить это только один раз?

Спасибо


person TLd    schedule 07.05.2020    source источник


Ответы (1)


Вы можете использовать setupFiles для глобальной настройки тестовых фикстур. Вы можете назначить переменные, которые хотите использовать в нескольких тестовых файлах, для Node.js global объект.

E.g.

app.ts:

import express, { Request, Response } from 'express';

export default class Server {
  server: any;

  exp: any;

  constructor() {
    this.exp = express();
    this.exp.get('/', (_req: Request, res: Response) => {
      res.json('works');
    });
  }

  start(): void {
    this.server = this.exp.listen(3000);
  }

  stop(): void {
    this.server.close();
  }
}

app.setup.js:

const App = require('./app').default;

beforeAll(() => {
  global.app = new App();
  global.app.exp.set('test setup', 1);
  console.log('app setup');
});

afterAll(() => {
  console.log('app stop');
});

jest.config.js:

module.exports = {
  preset: 'ts-jest/presets/js-with-ts',
  testEnvironment: 'node',
  setupFilesAfterEnv: [
    './jest.setup.js',
    '/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/stackoverflow/61659975/app.setup.js',
  ],
  testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'],
  verbose: true,
};

a.controller.test.js:

describe('controller a', () => {
  it('should pass', () => {
    console.log('test setup:', global.app.exp.get('test setup'));
    expect(1 + 1).toBe(2);
  });
});

b.controller.test.js:

describe('controller b', () => {
  it('should pass', () => {
    console.log('test setup:', global.app.exp.get('test setup'));
    expect(1 + 1).toBe(2);
  });
});

результаты модульного теста:

 PASS  stackoverflow/61659975/a.controller.test.js
  controller a
    ✓ should pass (5ms)

  console.log
    app setup

      at Object.<anonymous> (stackoverflow/61659975/app.setup.js:6:11)

  console.log
    app setup

      at Object.<anonymous> (stackoverflow/61659975/app.setup.js:6:11)

  console.log
    test setup: 1

      at Object.<anonymous> (stackoverflow/61659975/b.controller.test.js:3:13)

  console.log
    test setup: 1

      at Object.<anonymous> (stackoverflow/61659975/a.controller.test.js:3:13)

  console.log
    app stop

      at Object.<anonymous> (stackoverflow/61659975/app.setup.js:10:11)

  console.log
    app stop

      at Object.<anonymous> (stackoverflow/61659975/app.setup.js:10:11)

 PASS  stackoverflow/61659975/b.controller.test.js
  controller b
    ✓ should pass (3ms)

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        6.749s, estimated 12s
person slideshowp2    schedule 11.05.2020