2014-09-22 62 views
0

我是新來的在node.js中測試,我想模擬一個特定的函數調用返回的過程,看起來像下面。node.js中的模擬函數返回測試

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

,我想嘲笑的功能爲getDataFromDB()和專門的文件(使用MongoDB的),它返回。 我怎麼能用摩卡做這樣的事情?

部分代碼,從邏輯條之間,如下:

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

導入的,我不能真正想到這個解決方案,而沒有看到它是如何綁在一起的一個例子。 – James 2014-09-22 10:59:59

+0

我編輯我的答案,通過添加我想模擬的代碼。 – 2014-09-22 11:45:28

+0

require()的範圍可以提供一種方法來在sinon.js的測試中進行簡單的依賴注入,而不需要引入大量額外的函數參數。我將根據這些方面進行更廣泛的回答。 – LrdCasimir 2014-09-23 00:35:51

回答

0

這是我怎麼會這類問題的方法:

首先創建一個包裝,你想注入依賴關係的「config.js」。這將成爲你的容器。

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

module.exports = { 
    db: db 
}; 

從那裏,你可以調用配置的依賴,像這樣: 無功配置=需要( './指數/配置'); config.db.doSomeDbWork(function(data){ 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()

+0

我試過嘲笑模塊,但並不那麼靈活。我將不得不爲每個測試場景創建模擬模塊。最重要的是,我想要使用模塊的unmocked方法。我現在正在尋找「代言人」,它似乎爲我做了這份工作。 – 2014-09-23 07:43:53

+0

Proxyquire實際上看起來非常適合這種情況。與這種方法類似,沒有額外的模塊封裝開銷。 – LrdCasimir 2014-09-23 18:09:27