诺克拦截器链接,第二个模拟被忽略
Nock interceptors chaining, second mock ignored
一个带有 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: '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 之后 - 诺克清除该范围的待处理模拟并将其标记为完成。
重要的是基本 URL 是一样的。
是bug还是我用错了。
你的测试有一些小问题。
首先,传递给 nock
的值应该只是 origin,不应包含路径的一部分。相反,在您的情况下,get
和 post
应该具有完整路径。
其次,您想删除 encodedQueryParams: true
。 That flag means 拦截器是使用已经编码的 query/search 参数创建的,但是,您像 .query({k: 'v'})
一样调用它,这不是预编码的。
最后一个问题是您没有在测试完成时告诉 Mocha。所以它在获得所有结果之前完成了测试。有两种方法可以实现这一点。要么接受 it
回调中的参数,done
是命名法。或者使回调异步并等待您的请求。我在下面实现了后者。
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 的模拟请求链的简单示例。
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 之后 - 诺克清除该范围的待处理模拟并将其标记为完成。
重要的是基本 URL 是一样的。
是bug还是我用错了。
你的测试有一些小问题。
首先,传递给 nock
的值应该只是 origin,不应包含路径的一部分。相反,在您的情况下,get
和 post
应该具有完整路径。
其次,您想删除 encodedQueryParams: true
。 That flag means 拦截器是使用已经编码的 query/search 参数创建的,但是,您像 .query({k: 'v'})
一样调用它,这不是预编码的。
最后一个问题是您没有在测试完成时告诉 Mocha。所以它在获得所有结果之前完成了测试。有两种方法可以实现这一点。要么接受 it
回调中的参数,done
是命名法。或者使回调异步并等待您的请求。我在下面实现了后者。
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();
});