如何使用Mocha,Sinon和Chai测试返回函数的函数?

时间:2015-05-13 15:47:58

标签: javascript node.js mocha sinon chai

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

以下是一些澄清我的意思的代码:

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

     res.json(result);
  }
}

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

任何帮助都表示赞赏,谢谢!

2 个答案:

答案 0 :(得分:0)

您可以简单地写一下:

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变量的实际值。

答案 1 :(得分:0)

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

var utils;

module.exports.dependencies = function (_utils) {
    utils = _utils;
};

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

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