Javascript Nock拦截器链接,忽略第二个模拟
使用nock模拟请求链的一个简单示例Javascript Nock拦截器链接,忽略第二个模拟,javascript,node.js,mocha.js,nock,Javascript,Node.js,Mocha.js,Nock,使用nock模拟请求链的一个简单示例 const request = require('request-promise'); module.exports = () => { const URL1 = 'https://my.host.com/a/b/c/d'; const URL2 = 'https://my.host.com/a/b/x/y?k=v'; const options = { method: 'PO
const request = require('request-promise');
module.exports = () => {
const URL1 = 'https://my.host.com/a/b/c/d';
const URL2 = 'https://my.host.com/a/b/x/y?k=v';
const options = {
method: 'POST',
uri: URL2,
body: {
some: 'payload'
},
json: true
};
return request(URL1)
.then(() => request(options))
.catch(e => console.error(e))
};
并对其进行测试:
require('should');
const nock = require('nock');
const testFn = require('./');
describe('Check endpoint requests', () => {
beforeEach(() => {
nock.disableNetConnect();
});
afterEach(() => {
nock.cleanAll();
nock.enableNetConnect();
});
it('should hit correct endpoints', () => {
const scope = nock(`https://my.host.com/a/b`, {
encodedQueryParams: true,
})
.get('/c/d')
.reply(200)
.post('/x/y', {
some: 'payload'
})
.query({k: 'v'})
.reply(200);
testFn().then(() =>
scope.isDone().should.be.true()
);
});
});
因此,在测试期间,第二个POST请求模拟被完全忽略。在命中第一个模拟URL1-nock后,清除该作用域的挂起模拟并将其标记为完成
重要的是,基本URL是相同的
这是一个bug,还是我用错了 您的测试中有一些小问题 首先,传递给nock的值应该只是路径的一部分,不应该包括路径的一部分。相反,在您的情况下,get和post应该具有完整的路径 其次,要删除encodedQueryParams:true。拦截器是使用已经编码的查询/搜索参数创建的,但是,您可以像.query{k:'v'}一样调用它,它不是预编码的 最后一个问题是测试结束时你没有告诉摩卡。因此,它是在得到所有结果之前完成测试的。有两种方法可以实现这一点。要么接受it回调中的参数,要么完成命名。或者使回调异步并等待您的请求。我已经在下面实现了后者
it('should hit correct endpoints', async () => {
const scope = nock('https://my.host.com')
.get('/a/b/c/d')
.reply(200)
.post('/a/b/x/y', {
some: 'payload'
})
.query({k: 'v'})
.reply(200);
await testFn();
scope.isDone().should.be.true();
});
你的测试中有一些小问题 首先,传递给nock的值应该只是路径的一部分,不应该包括路径的一部分。相反,在您的情况下,get和post应该具有完整的路径 其次,要删除encodedQueryParams:true。拦截器是使用已经编码的查询/搜索参数创建的,但是,您可以像.query{k:'v'}一样调用它,它不是预编码的 最后一个问题是测试结束时你没有告诉摩卡。因此,它是在得到所有结果之前完成测试的。有两种方法可以实现这一点。要么接受it回调中的参数,要么完成命名。或者使回调异步并等待您的请求。我已经在下面实现了后者
it('should hit correct endpoints', async () => {
const scope = nock('https://my.host.com')
.get('/a/b/c/d')
.reply(200)
.post('/a/b/x/y', {
some: 'payload'
})
.query({k: 'v'})
.reply(200);
await testFn();
scope.isDone().should.be.true();
});