Как запустить сервер express, используя testEnvironment в качестве NodeEnvironment? - PullRequest
0 голосов
/ 16 апреля 2020

После изучения вопросов:

  1. Asyn c настройка среды с Jest
  2. окно / документ не определен в импорте
  3. Настройка настройки глобальных тестов Jest с помощью файла .ts (TypeScript)
  4. О функции обратного вызова app.listen ()
  5. Как написать файл конфигурации Jest
  6. NodeJS: Как получить порт сервера?
  7. https://alligator.io/nodejs/serving-static-files-in-express/
  8. Promisify server.listen
  9. Неожиданный импорт токена в пользовательской среде узла
  10. Как получить доступ к классу свойства Jest Test Environment внутри дочернего теста?
  11. Невозможно создать пользовательское TestEnvironment в Jest
  12. globalSetup выполняется в другом контексте, чем тесты
  13. global beforeAll
  14. Как проверить изменение URL с помощью Jest
  15. Укажите window.location для каждого тестового файла е или Jest
  16. window.location.href нельзя изменить в тестах
  17. global beforeAll
  18. Как проверить один файл с помощью Jest?
  19. https://basarat.gitbook.io/typescript/intro-1/jest

Мне удалось это сделать:

пакет. json

{
  "name": "my-project",
  "jest": {
    "testEnvironment": "./testEnvironment.js",
  }
}

testEnvironment. js

const express = require('express');
// const NodeEnvironment = require('jest-environment-node'); // for server node apps
const NodeEnvironment = require('jest-environment-jsdom'); // for browser js apps

class ExpressEnvironment extends NodeEnvironment {
  constructor(config, context) {
    super(config, context);
  }

  async setup() {
    await super.setup();
    const app = express();

    this.global.server = app.listen(0, "127.0.0.1", () => {
        console.log(`Running express server on '${JSON.stringify(server.address())}'...`);

        how to make setup() wait until app.listen callback is finished, 
        i.e., the server has properly started.

    });
    app.use(express.static('../testfiles'));
  }

  async teardown() {
    this.global.server.close();
    await super.teardown();
  }

  runScript(script) {
    return super.runScript(script);
  }
}

module.exports = ExpressEnvironment;

Как заставить setup() ждать, пока app.listen() обратный вызов завершен, т.е. сервер правильно запущен?

Раньше, когда я использовал beforeAll(), мой код работал нормально, потому что я мог использовать done() asyn c пройденный обратный вызов beforeAll():

const express = require('express');
const app = express();
var server;

beforeAll(async (done) => {
    server = app.listen(0, "127.0.0.1", () => {
        console.log(`Running express server on '${JSON.stringify(server.address())}'...`);
        done();
    });
    app.use(express.static('../testfiles'));
});

afterAll(() => {
    server.close();
});

Каким будет эквивалент обратного вызова beforeAll done() для функции NodeEnvironment setup()?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

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

  const app = express();
  let server;
  await new Promise(resolve => server = app.listen(0, "127.0.0.1", resolve));
  this.global.server = server;

Вы также можете добавить пользовательский обратный вызов, который будет просто вызовите средство разрешения обещаний в качестве третьего аргумента для app.listen(), и он должен выполнить этот код, а затем вызвать решение, если вам нужна какая-либо диагностика.

0 голосов
/ 16 апреля 2020

Расширение Роберт Меннелл ответ:

Вы также можете добавить пользовательский обратный вызов, который будет просто вызывать решатель обещаний в качестве третьего аргумента app.listen(), и он должен работать этот код затем вызывает функцию resol, если вам нужна какая-либо диагностика.

let server;
const app = express();

await new Promise(function(resolve) {
    server = app.listen(0, "127.0.0.1", function() {
        console.log(`Running express server on '${JSON.stringify(server.address())}'...`);
        resolve();
    });
});
this.global.server = server;

Затем вы можете получить доступ к this.global.server в ваших тестовых файлах, чтобы получить порт / адрес сервера: Is Возможно ли создать сервер Express. js в моем наборе тестов Jest?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...