2016-02-26 68 views
2

在我的原始函數中,我需要在同一個沙發登錄中向2個不同的數據庫發出2個請求。使用nock來模擬多個沙發db請求

var cloudant = require('cloudant')(https://cloudant_url); 
var userdb = cloudant.db.use('user'); 
var addrdb = cloudant.db.use('address'); 

function onChange(username) { 

    userdb.get(username, function(err,resp) { 
     var user_id = resp.id; 
     addrdb.get(user_id,function(err1,resp1){ 
      var addr = resp1.address; 
     }); 
    }); 
}; 

var nockVar = function() { 
nock(testCloudantDBURL) 
    .get('/user/jack') 
    .reply(200,{'id' : 123}); 

nock(testCloudantDBURL) 
    .get('/address/123') 
    .reply(200,{'address':'123}); 
}; 

describe('Test Cloudant Listener code' , function() { 
    nockVar(); 

    it('test get scenario', function() { 
     onChange('jack'); 
    }); 
}); 

有了這個只在第一次調用的作品,我可以得到ID:123上的地址數據庫的第二個電話是沒有得到intercepeted。

隨着諾克我能攔截只有第一個電話,第二個電話不會發生。任何指針?

+0

請張貼代碼。 – bolav

回答

1

這是因爲你的代碼是異步執行的,你的測試不等待userdb.get和addrdb.get完成。處理這個問題的最簡單方法就是在測試場景中添加完成的回調函數,並在onChange函數完成後立即調用它。大致類似於:

function onChange(username, done) { 

    userdb.get(username, function(err,resp) { 
     var user_id = resp.id; 
     addrdb.get(user_id,function(err1,resp1){ 
      var addr = resp1.address; 
      done(); 
     }); 
    }; 
}; 

    it('test get scenario', function(done) { 
       onChange('jack', done); 
     }); 

您也可以考慮使用基於Promises的代碼。