如何使用testEnvironment作为NodeEnvironment启动快速服务器?

问题描述 投票:0回答:2

调查了问题Async setup of environment with Jest之后,我能够做到这一点:

package.json

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

test_environment.js

const express = require('express');
const NodeEnvironment = require('jest-environment-node');

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()传递的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();
});

与NodeEnvironment done()函数上的beforeAll setup()回调等效吗?

javascript express jest
2个回答
2
投票

您可以通过甚至等待侦听,将其包装在promise中,然后将promise解析为服务器侦听的回调来执行此操作

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

您还可以放置一个自定义的回调,该回调仅将promise解析器作为app.listen()的第三个参数,它应运行该代码,然后在需要某种诊断时调用resolve。


0
投票

扩展Robert Mennell答案:

您还可以放置一个自定义的回调,该回调仅将promise解析器作为app.listen()的第三个参数,它应运行该代码,然后在需要某种诊断时调用resolve。

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;
© www.soinside.com 2019 - 2024. All rights reserved.