0

我正在尝试测试在回调中调用了某个函数,但是我不明白如何包装外部函数。我使用 mocha 作为我的测试套件,使用 chai 作为我的断言库,使用 sinon 作为我的假货。

文件测试.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 是否被调用?

4

2 回答 2

0

一种可能的解决方案是提取回调,然后将其强制执行所需的失败或成功路径。这种提取可以使用一个名为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);

然后你可以用你想要的参数调用extractCallback。

extractedCallback(myArg1, myArg2);

并在 res.f1 和 res.f2 上设置间谍

sinon.spy(res, 'f1');

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

于 2017-05-01T14:40:07.893 回答
0
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);
于 2017-04-27T21:29:18.943 回答