Javascript sinon测试回调

Javascript sinon测试回调,javascript,callback,mocking,spy,sinon-chai,Javascript,Callback,Mocking,Spy,Sinon Chai,我试图测试某个函数是否在回调中被调用,但是我不知道如何包装外部函数。我使用mocha作为我的测试套件,chai作为我的断言库,sinon作为我的赝品 fileToTest.js const externalController = require('./externalController'); const processData = function processData( (req, res) { externalController.getAllTablesFromDb( (err

我试图测试某个函数是否在回调中被调用,但是我不知道如何包装外部函数。我使用mocha作为我的测试套件,chai作为我的断言库,sinon作为我的赝品

fileToTest.js

const externalController = require('./externalController');

const processData = function processData( (req, res) {
  externalController.getAllTablesFromDb( (errors, results) => {
    // call f1 if there are errors while retrieving from db
    if (errors) {
      res.f1();
    } else {
      res.f2(results);
    }
  )};
};

module.exports.processData = processData;
最后,我需要验证如果getAllTablesFromDb中有错误,将调用res.f1,如果没有错误,将调用res.f2

从这个代码段可以看出,externalController.getAllTablesFromDb是一个接受回调的函数,在本例中,我使用了一个arrow函数创建了回调


有人能解释一下我如何强制getAllTablesFromDb回调错误或成功,以便我可以使用间谍或模拟来验证调用了f1或f2吗

一种可能的解决方案是提取回调,然后强制回调沿着所需的失败或成功路径进行。可以使用名为的npm包完成此提取。通过从文件开头删除require行来提取回调,然后:

var errorSpy = sinon.spy(res, "f1");
var successSpy = sinon.spy(res, "f2");

// your function call

// error
expect(errorSpy.calledOnce);
expect(successSpy.notCalled);

// without errors
expect(errorSpy.notCalled);
expect(successSpy.calledOnce);
const proxyquire = require('proxyquire');

const externalController = proxyquire('path to externalController',
  'path to externalController dependency', {
    functionToReplace: (callback) => { return callback }
  }
});

const extractedCallback = externalController.getAllTablesFromDb(error, results);
然后可以使用所需的参数调用extractedCallback

extractedCallback(myArg1, myArg2);
并在res.f1和res.f2上设置一个间谍

sinon.spy(res, 'f1');

并执行您需要的任何断言逻辑

实际上,我在最后更新了问题文本。我更想弄清楚我需要用什么来替换getAllTablesFromDb,这样我就可以监视f1或f2了(我想你回答了我是如何监视它们的,谢谢你)。对不起,谢谢你!