在node.js测试中返回模拟函数

时间:2014-09-22 10:44:19

标签: node.js unit-testing mocha sinon

我是在node.js中测试的新手,我想在一个看起来如下的过程中模拟特定函数调用的返回。

doSomething(function(err, res){
    callAnotherOne(res, function(err, result){
        getDataFromDB(result, function(err, docs){
            //some logic over the docs here
        })
    })
})

我想要模拟的函数是getDataFromDB(),特别是它返回的文档(使用MongoDB)。 我怎么能用mocha做这样的事情?

部分代码,从中间的逻辑剥离,如下:

filterTweets(item, input, function(err, item) {
    //Some filtering and logging here

    db.getTwitterReplies(item, function(err, result) {
        if(err) {
            return callback('Failed to retrieve tweet replies');
        }

        //Do some work here on the item using the result (tweet replies)

        /***** Here I want to test that the result is the expected ****/

        db.storeTweets(item function (err, result){
            //error checks, logging
            callback();
        });
    });
});

根据Twitter回复的数量(函数调用" getTwitterReplies"),我将相应地修改我的对象(没有包含该代码)。我想看看基于不同的回复结果,我的对象是按预期构造的。

P.S。我在一些搜索之后也检查了sinon.js并且我设法模拟了回调(通过在我的项目之外编写一些测试代码)而不是返回嵌套函数调用的回调。

1 个答案:

答案 0 :(得分:0)

以下是我将如何处理此类问题:

首先创建一个“config.js”,它包含您要注入的依赖项。这将成为你的容器。

 var db = {
    doSomeDbWork : function(callback){
      callback("db data");
    }
 };

 module.exports = {
   db: db
 };

从那里,你可以像这样调用配置依赖:     var config = require('。/ index / config');     config.db.doSomeDbWork(功能(数据){       res.render('index',{title:'Express',data:data});     });

在你的测试中,轻松注入模拟/间谍:

var config = require('../routes/index/config');
config.db = {
  doSomeDbWork : function(callback){
    callback("fake db data");  
  }
};
var indexRouter = require('../routes/index');
indexRouter.get('/');

因为require调用引用相同的配置模块导出,所以对规范中配置所做的更改将反映在通过require()

导入的位置。