无法在后功能中停止快速服务器

时间:2019-05-23 09:20:39

标签: javascript node.js express testing

我使用此before函数进行Node测试:

before((done) => {
  app.startServer()
    .catch((err) => {
      done(err);
  });
});

我现在正在尝试编写一个after函数来停止服务器。

我希望这可能是

after(() => {
  app.stopServer(apiAddress)
    .catch((err) => {
      done(err);
    })
});

但这不起作用。

这些是我的express.js函数:

function startServer() {
  return new Promise((resolve, reject) => {
    app.listen(PORT, (err) => {
      if (err) reject(err);
      log.info(`Server listening on port ${PORT}`);
      resolve();
    });
  });
}

function stopServer(url) {
  return new Promise((resolve, reject) => {
    //const server = app.listen(url);
    app.close(url, (err) => {
      if (err) reject(err);
      log.info(`Server closed on ${url}`);
      resolve();
    });
  });
}

如何在after函数中停止express服务器?

2 个答案:

答案 0 :(得分:1)

我们使用“ supertest” npm软件包来测试Express.js应用程序。试试那个好东西。 https://www.npmjs.com/package/supertest

答案 1 :(得分:1)

根据this堆栈溢出问题并查看express文档。

app.listen

  

app.listen()方法返回一个http.Server对象,并且(对于HTTP)   是用于以下目的的便捷方法:


您正在调用的close方法是Http.close方法,其定义如下:

server.close([callback])

因此您的函数应如下所示:

function stopServer(url) {
  return new Promise((resolve, reject) => {
    app.close((err) => {
      if (err) reject(err);

      log.info(`Server closed on ${url}`);

      resolve();
    });
  });
}

此外,您必须知道close函数将挂起,直到所有连接都关闭。

看看this SO question



注意:

您可以使用Util.promisify简化语法

function startServer() {
  return Util.promisify(app.listen)(PORT);
}

function stopServer(url) {
  return Util.promisify(app.close)();
}

before((done) => {
  app.startServer()
    .then(() => done)
    .catch(done);
});

after(() => {
  app.stopServer()
    .then(() => done)
    .catch(done);
});