调查了问题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()
回调等效吗?
您可以通过甚至等待侦听,将其包装在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。
扩展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;