server.close() выдает «сервер не запущен» после каждого перехвата мокко

#express #mocha.js

#экспресс #mocha.js

Вопрос:

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

Но по какой-то причине, когда срабатывает каждый последующий случай, я получаю следующую ошибку: Ошибка [ERR_SERVER_NOT_RUNNING]: сервер не запущен.

Тестовый пример пройден, что означает, что сервер запущен и работает.

Я экспортирую сервер таким образом из моего app.js файл:

 var server = app.listen(3000, function () {
  var port = server.address().port;
  console.log("Example app listening at port %s", port);
});

module.exports = server; // Export server in order to use it in test files
  

Мой тестовый файл:

 describe("loading express", function () {
  var server;
  before(function (done) {
    User.deleteMany(done);
  });

  beforeEach(function () {
    server = require("../app");
  });
  afterEach(function (done) {
    server.close(done);
  });
  describe("Create user account with valid email address", function () {
    describe("Route: POST /signup", () => {
      it("201 HAPPY PATH", (done) => {
        chai
          .request(server)
          .post("/signup")
          .send({
            email: "test23222@test.test",
            password: "12345678",
            firstname: "testtest",
            lastname: "testtest",
          })
          .end((err, res) => {
            res.should.have.status(201);
            done();
          });
      });
    });
  });
});
  

Я считаю, что мне нужно экспортировать обещание.

Это то, что я получил до сих пор:

 var server = new Promise(function (resolve, reject) {
 app.listen(3000, function () {
  var port = server.address().port;
  console.log("Example app listening at port %s", port);
  resolve();
 });
}

module.exports = server; // Export server in order to use it in test files

in test suite:

var server = require('./app.js')

server.then(function() {
 ....
}
  

Комментарии:

1. Как вы думаете, почему server = await require("../app") нужно ждать запуска сервера? async/await работает только с обещаниями.

2. Также require будет кэшироваться модуль. нет смысла делать это внутри beforeEach , если вы каким-то образом не взломали алгоритм загрузки модуля.

3. ожидание / асинхронность были опечаткой перед копированием и вставкой из другого эксперимента, теперь удалены.

4. Хорошо, но все же, почему вы ожидаете, что сервер будет прослушивать порт сразу после того, как он вам потребуется. Ваш тест может завершиться раньше. Вам нужно предоставить какой-то способ дождаться завершения процесса «прослушивания» сервером, прежде чем переходить к тестированию.

5. Я следовал этому руководству: glebbahmutov.com/blog/how-to-correctly-unit-test-express-server но я думаю, мне нужно где-то добавить обещание…

Ответ №1:

Сервер закрывается при chai-http каждом выполнении запроса. Из документации chai-http:

Если вы хотите сохранить сервер открытым, возможно, если вы делаете несколько запросов, вы должны вызвать .keepOpen() after .request() и вручную закрыть сервер:

Например:

 chai
  .request(server)
  .keepOpen() // <-- Here
  .post("/signup")
  .send({
    email: "test23222@test.test",
    password: "12345678",
    firstname: "testtest",
    lastname: "testtest",
  })