我是在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并且我设法模拟了回调(通过在我的项目之外编写一些测试代码)而不是返回嵌套函数调用的回调。
答案 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()
导入的位置。