使用nock模仿多个沙发数据库请求

在我原来的function,我需要在同一个沙发login2个不同的数据库的请求。

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.地址数据库的第二个电话没有被拦截。

用诺克我能拦截只有第一个电话,第二个电话不会发生。任何指针?

发生这种情况是因为您的代码asynchronous执行,您的testing不会等待userdb.get和addrdb.get完成。 处理这个问题的最简单的方法就是给你的testing场景添加一个完成的callback函数,并在你的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的代码。