Javascript sinon 测试回调

Javascript sinon testing callback

我正在尝试测试某个函数是否在回调中被调用,但是我不明白如何包装外部函数。我使用 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 是一个接受回调的函数,在本例中我是使用箭头函数创建的。

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

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);

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

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');

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