Mocha Before Hook不能异步工作

时间:2017-10-27 04:37:09

标签: express asynchronous mocha

我似乎无法将before Hook变为异步。

我已经使用了一个before钩子来启动它,但它确实会在它失败时尝试拾取,这样我就可以失败/跳过整个块(因为没有要测试的服务器)。

我在整个代码中都使用了[async] before挂钩,但在这种情况下,它并没有等待我的done被解雇。

基本上,得到了一堆MochaJS测试,对于一个块,我需要启动一个Web服务器,以便我可以使用它来测试RESTful API。我想确保它成功启动,因此是异步方法。

describe('RESTful Tests', function(){
    // Start up the whole express server for these API tests
    before(function(done) {
        try {
            server.on('error', (e) => {
                console.error("HERE");
                done();
            });

            listener = server.listen(port, function() {
                console.log("Server Started");
                done();
            });
            console.error("AFTER LISTEN");

        } catch(err) {
            console.error("ON Caught");
            done();
        }
        console.error("At End!!");
    });

这会运行,并在测试中显示为1) "before all" hook,但它不会等待done被调用。我只是得到了输出......

    RESTful Tests
AFTER LISTEN
At End!!
    1) "before all" hook

其他所有项目都没有出现,但我会得到一个关于EADDRINUSE的异常(预计会阻止端口)。我真的很难找到解决这个问题的方法。

我理解它是在一个不同的(有点)“线程”中,所以我不会接收错误,但仍然...... 为什么不遵循异步done方法?

1 个答案:

答案 0 :(得分:0)

似乎有些文件有点误导......

Node / ExpressJS文档状态,用于将.on('error'方法放在server对象上。在这种情况下似乎需要在listener对象上!

所以我的最终[工作]代码看起来像这样......

listener = server.listen(port, function() { 
    done();
}).on('error', (function(e) {
    this.skip(e.code);
    done();
}).bind(this));

耶!!! :)