我想在本地创建PR之前确保我的服务器正在运行,以测试没有任何内容被破坏。
worker.js
我的服务器导出一个承诺
module.exports = Promise.all([
hbsPartialsLoaded,
])
.then(() => {
let server;
if (!isTestEnvironment) {
server = app.listen(config.port);
}
return { server, app };
});
测试
let { expect, request } = require('chai')
.use(require('chai-http'))
.use(require('chai-cheerio'));
const config = require('../../app/config');
const worker = require('../../app/worker');
describe('server response', function () {
worker.then(() => {
before(function () {
server.listen(config.port);
});
it('should return 200', function (done) {
request.get(`http://localhost:${config.port}`, function (err, res, body){
expect(res.statusCode).to.equal(200);
done();
});
});
after(function () {
worker.close();
});
})
});
运行测试
NODE_ENV=test mocha --timeout 20000 --recursive test/ --compilers js:babel-core/register
0 passing (1ms)
我的测试永远不会运行。我怎样才能得到它让我等待sever.js
在测试运行之前完成它的承诺?
答案 0 :(得分:1)
你没有正确导出承诺,所以调用很糟糕,因为如果require("worker.js")
在调用.then
之前完成,你可能无法回调,它应该是worker().then
不是worker.then
,但这不是唯一的问题。
worker.js
应返回启动Promise.all
的函数。因此,将module.exports = Promise.all...
更改为module.exports = () => Promise.all...
使用before
启动服务器并同步调用it
。在it
内,您可以根据需要使用异步函数。
server.listen
在第二个参数上有一个回调函数,告诉你它什么时候结束,所以你可以使用promise并在那里解决它。
一个例子:
var expect = require('chai').expect;
describe('x', () => {
before(() => new Promise((resolve, reject) => setTimeout(resolve, 500)));
it('should work', (done) => setTimeout(() => expect(0).to.be.above(0), 500));
});
您案例的更好示例:
var expect = require('chai').expect;
var app = require('express')();
describe('x', () => {
before(() => new Promise((resolve, reject) => {
app.listen(3000, () => {
console.log('The server launched');
resolve();
});
}));
it('should work', (done) => {
console.log('I got called after the server got launched! :)');
setTimeout(() => expect(1).to.be.above(0), 500)
});
});
答案 1 :(得分:0)
it()
内直接调用 describe()
个函数。嵌套在承诺中并不能很好地阅读也不遵循标准测试过程
let { expect, request } = require('chai')
.use(require('chai-http'))
.use(require('chai-cheerio'));
const config = require('../../app/config');
const worker = require('../../app/worker');
describe('server response', function () {
before(function () {
server.listen(config.port);
});
it('should return 200', function (done) {
worker.then(() => {
request.get(`http://localhost:${config.port}`, function (err, res, body){
expect(res.statusCode).to.equal(200);
done();
});
})
});
after(function () {
worker.close();
});
});