【问题标题】:Javascript sinon testing callbackJavascript sinon 测试回调
【发布时间】:2017-09-25 20:34:22
【问题描述】:

我正在尝试测试在回调中调用了某个函数,但是我不明白如何包装外部函数。我使用 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。

从这个 sn-p externalController.getAllTablesFromDb 可以看出,它是一个接受回调的函数,在这种情况下,我使用箭头函数创建了回调。

谁能解释我如何强制回调失败或 getAllTablesFromDb 成功,以便我可以使用间谍或模拟来验证 f1 或 f2 是否被调用?

【问题讨论】:

    标签: javascript callback mocking spy sinon-chai


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      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);
      

      【讨论】:

      • 我实际上更新了最后的问题文本。我更想弄清楚我需要用什么替换 getAllTablesFromDb 以便我可以监视 f1 或 f2(我猜你回答了我将如何监视它们,所以谢谢你)。对不起,谢谢!
      猜你喜欢
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 2023-04-01
      • 2013-09-06
      • 2021-06-07
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多