在 express 服务器启动之前阻止 运行 的超级测试
Prevent supertest from running until express server has started
我有一个使用 yoman 全栈生成器生成的节点/快速 js 应用程序。我已经将 mongo / mongoose 换成 cloudant db(这只是 couchdb 的付费版本)。我为 Cloudant node.js 库编写了一个包装器,它通过包装在承诺中的 init()
方法处理我的实例的 cookie 身份验证。我已经重构了我的应用程序,以便在根据下面摘自我的 app.js
的代码段建立与数据库的连接之前不启动快速服务器
myDb.init(config).then(function (db) {
logger.write(1001, '','Connection to Cloudant Established');
// Start server
server.listen(config.port, config.ip, function () {
logger.write(1001, "",'Express server listening on '+config.port+', in '+app.get('env')+' mode');
});
});
在我的快速路线上,我引入了一个新的中间件,它将 db 对象附加到请求中,以便在整个中间件链中使用,如下所示。这在设置要使用的两个集合之前获取数据库连接对象。
exports.beforeAll = function (req, res, next) {
req.my = {};
// Adding my-db
req.my.db = {};
req.my.db.connection = myDb.getDbConnection();
req.my.db.orders = req.my.db.connection.use(dbOrders);
req.my.db.dbRefData = req.my.db.connection.use(dbRefData);
next();
};
当我通过 POSTman 手动驱动我的 api 时,此机制有效,因为在数据库连接的承诺得到解决之前,快速服务器不会启动。但是,当 运行 我的自动化测试时,前几个测试现在总是失败,因为在 jasmine 开始 运行 我针对 API 的测试之前,应用程序尚未完成数据库初始化。我可以在我的日志中看到请求通过,并且在中间件中 myDb.getDbConnection();
返回 undefined
。我正在使用 supertest 和 node-jasmine 来 运行 我的测试。例如
'use strict';
var app = require('../../app');
var request = require('supertest');
describe('GET /api/content', function () {
it('should respond with JSON object', function (done) {
request(app)
.get('/api/content')
.expect(200)
.expect('Content-Type', /json/)
.end(function (err, res) {
if (err) return done(err);
expect(res.body).toEqual(jasmine.any(Object));
done();
});
});
});
所以,我的问题是如何防止 supertest 在 server.listen()
步骤因 myDb.init()
调用被解析而完成之前发出请求?或者也许有某种茉莉花 beforeAll 我可以用来阻止它 运行描述直到承诺得到解决?
你可以让你 app
return 一个 EventEmitter,它在完成初始化后发出 "ready" 事件。
然后您的测试代码,在 before
子句中,可以等到 "ready" 事件从应用程序到达,然后再继续测试。
我有一个使用 yoman 全栈生成器生成的节点/快速 js 应用程序。我已经将 mongo / mongoose 换成 cloudant db(这只是 couchdb 的付费版本)。我为 Cloudant node.js 库编写了一个包装器,它通过包装在承诺中的 init()
方法处理我的实例的 cookie 身份验证。我已经重构了我的应用程序,以便在根据下面摘自我的 app.js
myDb.init(config).then(function (db) {
logger.write(1001, '','Connection to Cloudant Established');
// Start server
server.listen(config.port, config.ip, function () {
logger.write(1001, "",'Express server listening on '+config.port+', in '+app.get('env')+' mode');
});
});
在我的快速路线上,我引入了一个新的中间件,它将 db 对象附加到请求中,以便在整个中间件链中使用,如下所示。这在设置要使用的两个集合之前获取数据库连接对象。
exports.beforeAll = function (req, res, next) {
req.my = {};
// Adding my-db
req.my.db = {};
req.my.db.connection = myDb.getDbConnection();
req.my.db.orders = req.my.db.connection.use(dbOrders);
req.my.db.dbRefData = req.my.db.connection.use(dbRefData);
next();
};
当我通过 POSTman 手动驱动我的 api 时,此机制有效,因为在数据库连接的承诺得到解决之前,快速服务器不会启动。但是,当 运行 我的自动化测试时,前几个测试现在总是失败,因为在 jasmine 开始 运行 我针对 API 的测试之前,应用程序尚未完成数据库初始化。我可以在我的日志中看到请求通过,并且在中间件中 myDb.getDbConnection();
返回 undefined
。我正在使用 supertest 和 node-jasmine 来 运行 我的测试。例如
'use strict';
var app = require('../../app');
var request = require('supertest');
describe('GET /api/content', function () {
it('should respond with JSON object', function (done) {
request(app)
.get('/api/content')
.expect(200)
.expect('Content-Type', /json/)
.end(function (err, res) {
if (err) return done(err);
expect(res.body).toEqual(jasmine.any(Object));
done();
});
});
});
所以,我的问题是如何防止 supertest 在 server.listen()
步骤因 myDb.init()
调用被解析而完成之前发出请求?或者也许有某种茉莉花 beforeAll 我可以用来阻止它 运行描述直到承诺得到解决?
你可以让你 app
return 一个 EventEmitter,它在完成初始化后发出 "ready" 事件。
然后您的测试代码,在 before
子句中,可以等到 "ready" 事件从应用程序到达,然后再继续测试。