我有一个带有几个端点的express应用程序,目前正在使用mocha、chai和chai-http对其进行测试。在我为池化mongo连接添加逻辑并开始构建依赖于DB连接的端点之前,这种方法工作得很好。基本上,在我导入我的API路由并启动应用程序之前,我想确保我已经连接到了mongo。
我的问题是,我在理解如何为chai-http导出我的应用程序时遇到了问题,但在测试任何端点之前,还要确保有一个DB连接。
在这里,我连接到mongo,然后在一个回调中应用我的API并启动应用程序。这个示例的问题是,我的测试将在建立到数据库的连接之前和定义任何端点之前开始。我可以将app.listen
和api(app)
移到MongoPool.connect()
回调之外,但是我仍然有一个问题,即在测试运行时没有数据库连接,所以我的端点将失败。
server.js
import express from 'express';
import api from './api';
import MongoPool from './lib/MongoPool';
let app = express();
let port = process.env.PORT || 3000;
MongoPool.connect((err, success) => {
if (err) throw err;
if (success) {
console.log("Connected to db.")
// apply express router endpoints to app
api(app);
app.listen(port, () => {
console.log(`App listening on port ${port}`);
})
} else {
throw "Couldnt connect to db";
}
})
export default app;
如何使用chai-http测试我的端点,同时确保在实际执行测试之前存在池连接?以一种符合我正在使用的测试的方式编写我的应用程序,感觉很脏。这是我的池实现的设计问题吗?有没有更好的方法用chai-http测试我的端点?
下面是我正在运行的测试
test.js
let chai = require('chai');
let chaiHttp = require('chai-http');
let server = require('../server').default;;
let should = chai.should();
chai.use(chaiHttp);
//Our parent block
describe('Forecast', () => {
/*
* Test the /GET route
*/
describe('/GET forecast', () => {
it('it should GET the forecast', (done) => {
chai.request(server)
.get('/api/forecast?type=grid&lat=39.2667&long=-81.5615')
.end((err, res) => {
res.should.have.status(200);
done();
});
});
});
});
这是我正在测试的端点
/api/forecast.js
import express from 'express';
import MongoPool from '../lib/MongoPool';
let router = express.Router();
let db = MongoPool.db();
router.get('/forecast', (req, res) => {
// do something with DB here
})
export default router;
感谢您的帮助
发布于 2019-03-25 02:32:18
在收到一些很好的反馈后,我发现这个基于Gomzy's answer和Vikash Singh's answer的解决方案最适合我。
在server.js中,我连接到mongo池,然后在express app
上发出'ready‘事件。然后在测试中,我可以使用before()
等待'ready‘事件在应用程序上发出。一旦发生这种情况,我就可以开始执行测试了。
server.js
import express from 'express';
import bodyParser from 'body-parser';
import MongoPool from './lib/MongoPool';
let app = express();
let port = process.env.PORT || 5000;
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
(async () => {
await MongoPool.connect();
console.log("Connected to db.");
require('./api').default(app);
app.listen(port, () => {
console.log(`Listening on port ${port}.`)
app.emit("ready");
});
})();
export default app;
test.js
//Require the dev-dependencies
import chai from 'chai';
import chaiHttp from 'chai-http';
import server from '../src/server';
let should = chai.should();
chai.use(chaiHttp);
before(done => {
server.on("ready", () => {
done();
})
})
describe('Forecast', () => {
describe('/GET forecast', () => {
it('it should GET the forecast', (done) => {
chai.request(server)
.get('/api/forecast?type=grid&lat=39.2667&long=-81.5615')
.end((err, res) => {
res.should.have.status(200);
done();
});
});
});
});
发布于 2019-03-20 13:53:32
Express app
是EventEmitter的一个实例,因此我们可以轻松地订阅事件。也就是说,app
可以监听“ready”事件。
您的server.js
文件将如下所示,
import express from 'express';
import api from './api';
import MongoPool from './lib/MongoPool';
let app = express();
let port = process.env.PORT || 3000;
app.on('ready', function() {
app.listen(3000, function() {
console.log('app is ready');
});
});
MongoPool.connect((err, success) => {
if (err) throw err;
if (success) {
console.log('Connected to db.');
// apply express router endpoints to app
api(app);
// All OK - fire (emit) a ready event.
app.emit('ready');
} else {
throw 'Couldnt connect to db';
}
});
export default app;
发布于 2019-03-19 16:28:35
在您的测试中,在函数之前使用,如下所示:
describe('Forecast', () => {
before(function(done){
checkMongoPool(done); // this function should wait and ensure mongo connection is established.
});
it('/GET forecast', function(cb){
// write test code here ...
});
});
你可以在下面的方法中检查mongodb连接:
方法1:只需检查readyState属性-
mongoose.connection.readyState == 0; // not connected
mongoose.connection.readyState == 1; // connected`
方法2:使用事件
mongoose.connection.on('connected', function(){});
mongoose.connection.on('error', function(){});
mongoose.connection.on('disconnected', function(){});
https://stackoverflow.com/questions/55175924
复制相似问题