【问题标题】:calling kriskowal type promise function in Mocha's before and after function在 Mocha 的 before 和 after 函数中调用 kriskowal 类型的 promise 函数
【发布时间】:2016-11-21 16:24:40
【问题描述】:

大家好,我正在编写 Mocha 测试来测试我的 Node.js 服务器。测试只需要检查我写的一个json文件IO实用程序是否可以正确写入文件。问题之一是我不确定如何在 before 函数中正确调用异步函数(返回 kriskowal/q 类型的承诺)。在运行测试用例之前,我需要等待之前部分中的异步函数完成。

根据https://mochajs.org/#asynchronous-code,before 函数需要进行“完成”回调才能等待完成。但是由于我的函数返回一个承诺,我可以简单地执行以下操作来利用 done 函数:?

describe("test create/read/delete json file", function () {
    before(function (done) {
        fileHelper.writeJsonFile(mailTypeFile, json, {spaces: 2}).then(function () {
            done();
        }).catch(function (error) {
            done(error);
        })
    });

    after(function (done) {
        fileHelper.deleteFile(mailTypeFile).then(function () {
            done();
        }).catch(function (error) {
            done(error);
        })
    });

    it('should create mailtype', function (done) {
        fileHelper.readJsonFile(mailTypeFile).then(function (data) {
            expect(data).to.have.property('required');
            expect(data).to.have.property('properties');
            done();
        }).catch(function (error) {
            done(error);
        })
    })
});

因此,如果 promise 解决,我调用 done(),如果 promise 拒绝,我调用 done(err)。是否保证等待 before() 完成?

【问题讨论】:

    标签: node.js mocha.js q


    【解决方案1】:

    由于您的函数返回承诺,您可以只返回承诺。 Mocha 将等待承诺被解决或拒绝,然后再进行下一步。不要在传递给 itbeforeafter 的匿名函数的参数中声明 done 并且不要调用它。

    【讨论】:

    • 但是由于我的 promise 是一个遵循 then()..catch()..done() 格式的 Q promise,这与其他常见的 promise 语法不同,它是否仍然允许返回这样一个以前在里面答应过吗?
    • Mocha 不会为你调用 promise 的 .done()。这意味着如果 Mocha 的拒绝处理程序中有错误,则不会捕获该错误。但是,这意味着 Mocha 是错误的。我不会假设 Mocha 无法正常运行来编写我的测试,我认为这样做并不明智,因为 Mocha 可能无法正常运行的方式真的没有尽头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多