如何在Node.js的回调中正确测试代码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Node.js的回调中正确测试代码?相关的知识,希望对你有一定的参考价值。

我在Node.js相对较新。现在,我用MochaChai编写单元测试,结果发现自己在测试匿名函数内的代码时陷入困境,这些匿名函数被编写为异步函数的回调。

我重新创建了一些示例代码来解释我的情况。具有这些异步功能:

asyncAddition = function (a, b, callback) {
    setTimeout(() => {
        callback(a + b);
    }, 3000);
}

asyncSubstraction = function (a, b, callback){
    setTimeout(() => {
        callback(a - b);
    }, 3000);
}

[我想在不将任何回调作为参数的类方法calculate中使用它们,而仅使用两个操作数ab以及具有计算类型的字符串,这是异步进行的,将结果放入result成员中:

class Example{

    constructor(){
        this.result = null;
    }

    calculate(a, b, action){

        if (action == "add") {

            asyncAddition(a, b, (result) =>{
                this.result = result;
                console.log("Addition result is: " + result);
            });

        }
        else if (action == "substract") {

            asyncSubstraction(a, b, (result) =>{
                this.result = result;
                console.log("Substraction result is: " + result);
            });

        }
    }
}

由于result中的值是在回调代码中设置的,我该如何为calculate方法编写适当的测试,该方法根据不同的操作数和计算来检查result值?

答案

您可以使用Chai断言作为承诺。该软件包为Chai提供了一种流利的语言,用于断言有关诺言的事实。

您可以编写表达您真正含义的代码:

return doSomethingAsync().should.eventually.equal("foo");

在此处查看更多:https://www.chaijs.com/plugins/chai-as-promised/

如果您不想将功能变成承诺,则需要以这种方式测试代码

it("Using setTimeout to simulate asynchronous code!", function(done){
    setTimeout(function() {
        done();
    }, 3000);
});

以上是关于如何在Node.js的回调中正确测试代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Promise 和 node.js 正确检查和记录 http 状态代码?

如何使用async.js简化Node.js中的回调代码

Node.js回调函数

如何从回调函数中修改全局变量。在 node.js 中

如何返回 Node.js 回调

如何在node js中将promise转换为回调?