2016-02-26 9 views
2

В моей первоначальной функции мне нужно сделать 2 запроса на 2 разных db в одном и том же логове.Использование нока для имитации нескольких запросов 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'); 
    }); 
}); 

С этим только первые работы колл, и я могу получить идентификатор: 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); 
     }); 

Возможно, вам также стоит подумать о работе с кодом на основе обещаний.