node.js - 使用 nock 模拟多个 couch 数据库请求

标签 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。对地址数据库的第二个调用不会被拦截。

使用 nock,我只能拦截第一个调用,第二个调用不会发生。有任何指针吗?

最佳答案

发生这种情况是因为您的代码是异步执行的,并且您的测试不会等待 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);
        });

您还可以考虑使用基于 Promise 的代码。

关于node.js - 使用 nock 模拟多个 couch 数据库请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35647872/

相关文章:

javascript - 函数未定义,Bookshelf.js 模型函数未被识别为函数

couchdb - 过滤 couchdb 链接文档

android - 如何让移动网站的访问者离线访问 CouchDB 数据?

javascript - 使用 angularjs 将多个独立附件上传到 couchdb

javascript - 使用 nockjs 和 jest 对 promise /异步单元测试的代码覆盖问题

node.js - 使用 nock 运行模拟请求时如何忽略 header ?

node.js - "npm install"在 node_modules 目录中安装所有依赖项,而不是让它们嵌套

node.js - 用双引号替换 .toString() 单引号

javascript - 如何在 node.js 中设置 xlsx 文件的样式

javascript - 如何获得 nock 的响应