在开始 mocha 测试之前确保 express 应用程序是 运行
Ensure express app is running before starting mocha tests
我使用 express 和 node.js 为 couchbase 数据库构建了一个 API。我的问题是,当我 运行 我的一些测试失败时,因为服务器没有完全 运行ning。我在这里 https://mrvautin.com/ensure-express-app-started-before-tests 找到了关于如何解决这个问题的解决方案。文章指出,为了解决这个问题,您必须像这样在您的服务器文件中添加一个事件发射器
app.listen(app_port, app_host, function () {
console.log('App has started');
app.emit("appStarted");
});
然后在你的测试文件中添加这个
before(function (done) {
app.on("appStarted", function(){
done();
});
});
我试过了,这是我的实现
服务器文件
app.listen(config['server']['port'], function(){
app.emit("appStarted");
logger.info("Listening")
})
测试文件
before(function(done){
app.on("appStarted", function(){
done();
})
});
我不断收到以下错误
1) "before all" hook in "{root}":
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
at listOnTimeout (internal/timers.js:549:17)
at processTimers (internal/timers.js:492:7)
这篇文章来自 2016 年,所以我在想可能语法已被弃用。我想知道是否有人可以帮我指明正确的方向?
您可以添加以下条件,更多信息见"Accessing the main module".
if (require.main === module) {
// this module was run directly from the command line as in node xxx.js
} else {
// this module was not run directly from the command line and probably loaded by something else
}
例如
index.ts
:
import express from 'express';
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.sendStatus(200);
});
if (require.main === module) {
app.listen(port, () => {
console.log('App has started');
});
}
export { app, port };
index.test.ts
:
import { app, port } from './';
import http from 'http';
import request from 'supertest';
describe('63822664', () => {
let server: http.Server;
before((done) => {
server = app.listen(port, () => {
console.log('App has started');
done();
});
});
after((done) => {
server.close(done);
console.log('App has closed');
});
it('should pass', () => {
return request(server)
.get('/')
.expect(200);
});
});
集成测试结果:
(node:22869) ExperimentalWarning: The fs.promises API is experimental
63822664
App has started
✓ should pass
App has closed
1 passing (26ms)
我使用 express 和 node.js 为 couchbase 数据库构建了一个 API。我的问题是,当我 运行 我的一些测试失败时,因为服务器没有完全 运行ning。我在这里 https://mrvautin.com/ensure-express-app-started-before-tests 找到了关于如何解决这个问题的解决方案。文章指出,为了解决这个问题,您必须像这样在您的服务器文件中添加一个事件发射器
app.listen(app_port, app_host, function () {
console.log('App has started');
app.emit("appStarted");
});
然后在你的测试文件中添加这个
before(function (done) {
app.on("appStarted", function(){
done();
});
});
我试过了,这是我的实现
服务器文件
app.listen(config['server']['port'], function(){
app.emit("appStarted");
logger.info("Listening")
})
测试文件
before(function(done){
app.on("appStarted", function(){
done();
})
});
我不断收到以下错误
1) "before all" hook in "{root}":
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
at listOnTimeout (internal/timers.js:549:17)
at processTimers (internal/timers.js:492:7)
这篇文章来自 2016 年,所以我在想可能语法已被弃用。我想知道是否有人可以帮我指明正确的方向?
您可以添加以下条件,更多信息见"Accessing the main module".
if (require.main === module) {
// this module was run directly from the command line as in node xxx.js
} else {
// this module was not run directly from the command line and probably loaded by something else
}
例如
index.ts
:
import express from 'express';
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.sendStatus(200);
});
if (require.main === module) {
app.listen(port, () => {
console.log('App has started');
});
}
export { app, port };
index.test.ts
:
import { app, port } from './';
import http from 'http';
import request from 'supertest';
describe('63822664', () => {
let server: http.Server;
before((done) => {
server = app.listen(port, () => {
console.log('App has started');
done();
});
});
after((done) => {
server.close(done);
console.log('App has closed');
});
it('should pass', () => {
return request(server)
.get('/')
.expect(200);
});
});
集成测试结果:
(node:22869) ExperimentalWarning: The fs.promises API is experimental
63822664
App has started
✓ should pass
App has closed
1 passing (26ms)