这个异步JavaScript函数的单元测试有什么问题(通过Mocha / Sinon)?

时间:2014-08-29 20:31:28

标签: javascript unit-testing asynchronous mocha sinon

我试图将一个小例子放在一起展示同事,但无法弄清楚这个测试有什么问题that I've put in a gist

基本上我想测试一个执行异步操作的函数,但是使用Sinon的spy()函数来确保它完成:

function asyncHello(name, delay, cb) {
  setTimeout(function() {
    console.log("running after ", delay);
    cb("hello " + name);
  }, delay);
}



suite('Mega Suite', function(){

  suite("testing async hello", function() {
    test('should call the callback', function(done) {
      var cb = sinon.spy();
      asyncHello("foo", cb);

      cb.should.have.been.called();
      done();
    });
  });
});

使用Mocha和done()来解决依赖于异步函数的测试(在这种情况下为setTimeout)会起作用,但也许有人可以指出我错在哪里。谢谢!

1 个答案:

答案 0 :(得分:0)

你不需要Sinon:

function asyncHello(name, delay, cb) {
  setTimeout(function() {
    console.log("running after ", delay);
    cb("hello " + name);
  }, delay);
}

suite('Mega Suite', function(){
  suite("testing async hello", function() {
    test('should call the callback', function(done) {
      asyncHello("foo", 1000, function () {
        done();
      });
    });
  });
});

此代码中存在两个问题:

  1. 您调用了asyncHello("foo", cb);,使得函数内的delay参数设置为cb,函数内的cb参数未定义。

  2. 即使在修复第一项cb.should.have.been.called();之后,在传递给setTimeout的函数可以执行之前,也会调用它。

    您基本上不需要使用Sinon,因为如果您只是设置回调来调用done(),那么您就知道测试成功了。如果在任何地方done()无法调用问题,测试将失败。