我正在开发一个项目,我需要向API提供HTTP请求并处理通过套接字相互通信的用户(我正在使用Socket.io)。我的server.js文件的代码如下:
let initHttpServer = () => {
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(require('./routes'));
app.get('/config.js', function(req,res) { res.write("var ROOT_URL='"+process.env.ROOT_URL+"'" + '\n'); res.end(); });
http.listen(port, function() {
console.log('express listening on port' + port);
console.log('a user connected');
});
return app;
}
.
.
.
conn.once('open', function() {
initHttpServer();
});
module.exports = initHttpServer;
我也有一个io.on('connect'...)函数,但为了简洁起见,我不会在这里发布(至少还有)。 当我使用Postman进行测试时它工作正常,但是我在使用mocha和Chai测试HTTP端点时遇到了麻烦。我现在要测试的代码如下:
chai.use(chaiHttp);
it('should get votes', function(done) { // <= Pass in done callback
chai.request('http://localhost:3000')
.get('/vote')
.then(function(res) {
res.should.have.status(200);
})
.catch(function(err) {
throw err;
});
});
当我运行npm test
时,我收到以下错误:
Error: Timeout of 10000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
我已经尝试将我的测试函数放在try / catch块中,如下所示:
it('should return all votes on /votes', function(done) {
try{
chai.request('http://127.0.0.1:3000')
.get('/vote')
.end(function(req,res) {
res.should.have.status(787432189700);
done();
});
--> done();
} catch(error) {
done(error);
}
});
如果我采取完成();我用箭头指示的电话( - &gt;),我得到了上述错误,但如果我保留它,它只会返回成功,而不会测试任何东西。我假设它是一个异步调用,所以在测试完成之前调用done()。因此,我不知道如何进行。我该怎么做才能测试API端点?
谢谢!
答案 0 :(得分:0)
您的try / catch块无效,您正在进行异步调用。
最有可能是在这一行:res.should.have.status(787432189700);
出现错误,因此已完成未执行。
let chai = require('chai')
, chaiHttp = require('chai-http');
const expect = require('chai').expect;
chai.use(chaiHttp);
describe('Some test', () => {
it('Lets see', (done) => {
chai.request('http://localhost:3000')
.get('/vote')
.end(function (err, res) {
expect(err).to.be.null;
expect(res).to.have.status(200);
done();
});
});
});
请注意回调函数的第一个参数是错误。