【问题标题】:How do I test a function which returns a function using Mocha, Sinon, and Chai?如何使用 Mocha、Sinon 和 Chai 测试返回函数的函数?
【发布时间】:2015-07-25 00:39:51
【问题描述】:

我有一个返回另一个同名函数的函数。在第二个函数中,正在使用来自其他模块的函数。我只是想测试一下是否调用了其他模块的函数。

这里有一些代码来澄清我的意思:

exports.getCache = function (model) {
  return function getCache (req, res){
     //some code
     key = utils.uniqueKey(model, id)
     //some code

     res.json(result);
  }
}

我想检查是否正在调用 uniqueKey 以及是否正在调用 res.json。

感谢任何帮助,谢谢!

【问题讨论】:

    标签: javascript node.js mocha.js sinon chai


    【解决方案1】:

    你可以简单地写:

    sinon.spy(utils, 'uniqueKey')
    

    在您的测试文件中,可能在beforeEach 函数中。然后在调用chai.expect 函数时应该很容易检查它:

    expect(utils.uniqueKey.called).to.be.true();  
    expect(utils.uniqueKey.calledWith({modelValue: 'value'}, 'someId')).to.be.true(); 
    

    其中{modelValue: 'value'}'someId'modelid 变量的实际值。

    【讨论】:

    • 确实有道理。但是,我正在另一个名为 test.js 的文件中进行测试。因此,当我调用 getCache 函数时,它会从该文件调用 utils,而不是我在 test.js 中创建的 spy。我该如何解决这个问题?干杯,哈里特
    • 你可以用这种方式模拟所有的 utils 对象:utils = {uniqueKey: sinon.spy()}; 在你的测试文件中。
    【解决方案2】:

    要使您的组件可测试,您必须使其依赖项可注入。我看到你的代码取决于utils。要正确模拟这一点,您不能只是require('utils'),您必须实现某种方式来连接依赖项。使用一些 DI 库,或者只是扩展组件的公共接口:

    var utils;
    
    module.exports.dependencies = function (_utils) {
        utils = _utils;
    };
    
    module.exports.getCache = function (model) {
        key = utils.uniqueKey(model, id);
    };
    

    然后在生产代码中使用引导您的组件调用component.dependencies(require('utils'))。在测试用例中你可以传递一个间谍:component.dependencies(spy);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多