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

时间:2016-02-26 09:25:56

标签: node.js couchdb nock

在我的原始功能中,我需要在同一个沙发登录中向2个不同的数据库发出2个请求。

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。对地址db的第二次调用没有被拦截。

有了nock,我只能拦截第一个电话,第二个电话没有发生。有没有指针?

1 个答案:

答案 0 :(得分: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的代码。

相关问题