使用setTimeout()为异步函数编写Mocha测试

时间:2017-02-26 08:08:06

标签: javascript node.js mocha gulp-mocha

不知何故,我无法为一个相对非常简单的函数编写Mocha JS测试。 JavaScript源文件看起来像这样

exports.cb = function() {
    console.log("The function is called after 3 seconds");
}

exports.testfn = function(cb) {
  setTimeout(cb, 3000);
}

测试代码写为

describe('Main Test', function(){
  it('A callback Tests', function(done){
    asn.testfn(asn.cb);
    done();
  });
});

我遇到了2个问题。

    1. 测试代码立即以done()
    2. 结束
    1. 如果我没有调用done(),那么调用该函数但是测试失败,因为它希望调用done()来执行异步函数

我查看了文档,但不确定如何做到这一点。

我可以使用promises编写测试,但它运行正常。但是对于我们需要使用setTimeout的场景,应该怎么做?

2 个答案:

答案 0 :(得分:1)

假设您尝试测试的是testfn,您将不会使用cb,您在测试中使用了回调;见评论:

describe('Main Test', function(){
  it('testfn calls the function after three seconds', function(done){
    // Remember the start time
    var start = Date.now();
    // Schedule callback
    asn.testfn(function() {
        // Has it been at least three seconds?
        if (Date.now() - start < 3000) {
            // No, trigger an error
        } else {
            // Yes, all's good!
            done();
        }
    });
  });
});

如果您出于某种原因想要致电asn.cb,您可以在上面的匿名函数中执行此操作,但如果您想测试asn.cb,则应该从测试中做到这一点{ {1}}。

答案 1 :(得分:0)

describe('Main Test', function(){
  it('A callback Tests', function(done){
    asn.testfn(function() {
        asn.cb();
        done();
    });
  });
});