module.exports = Promise.all不在测试中工作

时间:2017-06-08 09:50:46

标签: javascript node.js http chai

我想在本地创建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在测试运行之前完成它的承诺?

2 个答案:

答案 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();
    });
});