什么'这个异步JavaScript函数的单元测试是错误的(通过Mocha/Sinon)

What's wrong with this unit test of an async JavaScript function (via Mocha/Sinon)?

本文关键字:错误 通过 Mocha Sinon 单元测试 什么 异步 函数 JavaScript      更新时间:2023-09-26

我试图把一个小例子放在一起向同事展示,但我无法弄清楚我放在要点中的这个测试出了什么问题。

本质上,我想测试一个异步的函数,但使用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)的测试会奏效,但也许有人可以指出我错了。谢谢

您不需要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. 即使在修复了第一项之后,在传递给setTimeout的函数能够执行之前,也调用了cb.should.have.been.called();

    你基本上不需要使用Sinon,因为如果你只设置一个回调来调用done(),那么你就知道测试成功了。如果任何地方出现问题,done()都不会被调用,测试就会失败。