Javascript 如何正确测试Node.js中包含多个异步回调的方法?

Javascript 如何正确测试Node.js中包含多个异步回调的方法?,javascript,node.js,unit-testing,anonymous-function,asynccallback,Javascript,Node.js,Unit Testing,Anonymous Function,Asynccallback,我在Node.js相对较新。现在我正在用Mocha和Chai编写单元测试,在测试匿名函数中的代码时,我发现自己陷入了困境,这些匿名函数是作为异步函数的回调编写的 我重新创建了一些示例代码来解释我的情况。具有以下异步功能: asyncAddition = function (a, b, callback) { setTimeout(() => { callback(a + b); }, 3000); } asyncSubstraction = functio

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

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

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

asyncSubstraction = function (a, b, callback){
    setTimeout(() => {
        callback(a - b);
    }, 3000);
}
我想在类方法
calculate
中使用它们,该类方法不接受任何回调作为参数,只接受两个操作数
a
b
以及一个计算类型的字符串,该字符串是异步生成的,并将结果放入
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,用于断言承诺的事实

您可以编写代码来表达您真正的意思:

返回doSomethingAsync().should.finally.equal(“foo”)

请参阅此处的更多信息:

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

it(“使用setTimeout模拟异步代码!”,函数(完成){
setTimeout(函数(){
完成();
}, 3000);
});

太好了!但是,它是否适用于使用
setTimeout
的代码?这将测试一个返回承诺的异步函数,我想在我的示例中测试的方法不是这样的。Thanx是您的答案,但是,再一次,这不是我在示例中尝试测试的。正如我在问题中所说,我需要从我的示例中测试“calculate”方法,它不接受任何回调。我需要根据传递给“calculate”的参数测试成员“result”的值。