Javascript 如何在有效回调后测试异步方法引发的错误? 形势

Javascript 如何在有效回调后测试异步方法引发的错误? 形势,javascript,node.js,unit-testing,mocha.js,Javascript,Node.js,Unit Testing,Mocha.js,我正在为一个错误的异步方法编写一个单元测试,该方法接受回调 该方法当前有一个bug,在回调后抛出一个错误 错误代码 真正的代码是,但这里是一个抽象版本: var myBuggyMethod = function(callback) { if (!hasProperCredentials()) { callback('Error: invalid credentials'); } someAsyncFunction .finally(() => ca

我正在为一个错误的异步方法编写一个单元测试,该方法接受回调

该方法当前有一个bug,在回调后抛出一个错误

错误代码 真正的代码是,但这里是一个抽象版本:


var myBuggyMethod = function(callback) {
   if (!hasProperCredentials()) {
      callback('Error: invalid credentials');
   }
   someAsyncFunction
     .finally(() => callback(null, myFailingMethod()));
}

var myFailingMethod = function() { throw new Error(); }
这里发生的情况是,如果
haspropertredentials()
返回
false
,它:

  • 使用有效的错误消息正确回拨
  • 但是

  • 它接着抛出一个错误(通过
    myFailingMethod
  • (注意:该方法出现错误的一个原因是,第一个回调应该以
    return
    作为前缀)

    测试尝试 我想编写一个测试,该测试因错误代码而失败,但在修复时将通过

    此测试可正确检测抛出的错误:

        it('should not error when provided invalid credentials', function(done) {
          expect(function() {
            myBuggyMethod(function(err, data) {});
          }).not.to.throw();
        });
    
    但是,它从不调用
    done
    ,这意味着如果满足预期,测试仍然失败(由于超时)

    如果我在处理程序中添加
    done
    ,测试将错误地通过(因为错误发生在调用处理程序之后)

    问题
    在异步回调后触发错误时,是否可以创建正确检测错误的测试?如果是,如何处理?

    更复杂的是,在我的情况下,错误似乎被抛出调用堆栈之外,因此事实上,
    not.To.throw()
    行甚至没有捕获错误,它只是因为发生错误而正确地失败了。
        it('should not error when provided invalid credentials', function(done) {
          expect(function() {
            myBuggyMethod(function(err, data) { done(); });
          }).not.to.throw();
        });