【问题标题】:How to test if callbacks are called as expected in the async module?如何测试异步模块中是否按预期调用回调?
【发布时间】:2016-04-26 02:47:52
【问题描述】:

在下面的代码中,两个函数在异步模块的帮助下同时运行。一旦获得了两个函数的结果,就会调用最终函数 dosomething3()。我将如何测试是否调用了正确的回调?

async.parallel([
    function(cb) {
        doSomething1(function(err, result) {
            if (err) return cb(err);    // WANT TO TEST
            cb(null, result);    //WANT TO TEST
        });
    },

    function(cb) {
        doSomething2(function(err, result) {
            if (err) return cb(err);    // WANT TO TEST
            cb(null, result);    //WANT TO TEST
        });
    }

], function(err, data) {
    if (err) return handleError(err);    //WANT TO TEST
    var result1 = data[0];
    var result2 = data[1];

    dosomething3(result1, result2, function(err) {
        if (err) return handleError(err);
        process.exit(0);
    })
});

【问题讨论】:

  • 如何在每个回调中使用console.log if(err){console.log('doSomething1 error', err); return cb(err); }等等
  • 是的,使用 console.log 或使用管理断点的 IDE 运行代码。
  • 您想调试回调调用还是确保调用所有回调都没有错误?
  • 我想使用 mocha 和 sinon 为回调编写单元测试。
  • @nomad 看到我的回答,希望你理解这个想法。查看更多信息here

标签: node.js asynchronous mocha.js sinon chai


【解决方案1】:

如果你想编写单元测试,你必须为函数 doSomething1、doSomething2、dsomething3、handleError 编写模拟。因此,根据测试用例,您将能够从这些函数中设置(或不设置)错误。

例如,doSomething1() 的 mock 将如下所示(只是想法,sinon 提供了用于测试函数调用的工具。参见here):

// global variables that are used to controll data passed in callback of doSomething1()
var doSomething1Error = null,
    doSomething1result = [],
    doSomething1CallCount = 0;
// the mock 
function doSomething1(cb) {
  doSomething1CallCount++;
  cb(doSomething1Error, doSomething1result);
}

然后,您的测试用例将如下所示

describe('doSomething1 ', function() {
  beforeEach(function(done) {
    // reset global vars used by mock
    doSomething1Error = null;
    doSomething1result = [];
    doSomething1CallCount = 0;
  });

  it('is called once with error', function() {
    doSomething1Error = 'User does not exist';
    // call you code under test (async.parallel([.....]))

    // check that doSomething1CallCount == 1
    // check that mock for handleError was called with 'User does not exist' error
  });

})

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 2018-06-10
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多