【问题标题】:How to properly test a method that contains several async callbacks in Node.js?如何在 Node.js 中正确测试包含多个异步回调的方法?
【发布时间】:2020-04-13 18:50:38
【问题描述】:

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

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

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 的值 ?

【问题讨论】:

    标签: javascript node.js unit-testing anonymous-function asynccallback


    【解决方案1】:

    您可以将 Chai 断言用于 Promise。这个包用一种流利的语言扩展了 Chai,用于断言关于 Promise 的事实。

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

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

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

    如果您不想将函数转换为 Promise,则需要以这种方式测试您的代码

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

    【讨论】:

    • 太好了!不过,它适用于使用 setTimeout 的代码吗?
    • 这将测试一个返回 Promise 的异步函数,而我要在示例中测试的方法并非如此。
    • 感谢您的回答,但再一次,这不是我要在我的示例中测试的内容。正如我在我的问题中所说,我需要测试我的示例中的“计算”方法,该方法不需要任何回调。我需要根据传递给“计算”的参数来测试成员“结果”的值。
    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多