[英]Mocking Multiple Http Post Requests using Jest in NodeJs
我的 Node JS 应用程序中有 2 个 https 请求,并且想要模拟具有不同状态和响应正文的两个请求。
下面是 index.js:
let api_resp_1 = await getMobileNo(context, subscriberId,);
if (api_resp_1 && api_resp_1.statusCode==200) {
let phone = api_resp_1.phone;
let api_resp_2 = await sendSMS(context, phone, 'somesms');
if (api_resp_2 && api_resp_2.statusCode==200)
res.status(200).send('SMS sent');
else
res.status(400).send('Problem in API 2');
}else
res.status(400).send('Problem in API 1');
http requests(getMobileNo,sendSMS) 将类似于我很久以前发布的HTTPS 。 现在,
我试图模拟如下:
test('2nd API Errors', async() => {
let decodedJson = {
keyValue: '0001b3f6-7754-4dcb-891e-someTestdata'
};
jest.doMock('../CommonFiles/jwtDecoder', () => (res, req, cb) => cb(null, decodedJson));
let httpFunction = require('../SMSHttpFunction/index')
let request = {
body: "test.jwt.secret"
};
//setting mock for database
jest.mock('tedious', () => ({
...jest.requireActual('tedious'),
Connection: jest.fn(() => ({
connect: () => {},
on: (connect, cb) => cb(),
close: () => {},
execSql: () => {}
})),
TYPES: jest.fn(),
Request: jest.fn(() => ({
constructor: (sqlString, cb) => cb('err', null, null),
addParameter: (name, type, value) => {},
on: (requestCompleted, cb) => cb('rowCount', 'more')
}))
}));
let api_resp_1 = `{
"resolvedTokens": [
{ "phone" : "1234"
],
"unresolvedTokens":[]
}`;
var https = require('https');
jest.mock('https', () => ({
...jest.requireActual('https'), // import and retain the original functionalities
request: (post_option, cb) => cb({
setEncoding: jest.fn(),
on: (data, cb) => cb(Buffer.from(api_resp_1, 'utf8')),
statusCode: jest
.fn()
.mockReturnValue(200)
.mockReturnValueOnce(400),
statusMessage: '2nd API failed'
}),
on: jest.fn(),
write: jest.fn(),
end: jest.fn()
}));
//creating context object
const context = await runStubFunctionFromBindings(httpFunction, [
{ type: 'httpTrigger', name: 'req', direction: 'in', data: request },
{ type: 'http', name: 'res', direction: 'out' },
], new Date());
console.log('context.res:->', context.res);
expect(context.res.status).toEqual(400);
expect(context.res.body.errorMessage).toBe('2nd API failed');
})
而不是实际的 statusCode,api_resp_1 如下所示
function () {
return fn.apply(this, arguments);
}
如果我将模拟中的状态码硬编码为 200,则它适用于所有 https 请求。 我想发送不同的状态码。
试过了
那么,如何模拟多个 https 请求?
最后经过几天的各种 Hit 和试验,我能够模拟多个 https。 我们可以利用请求的 post_option - 检查主机或路径,然后有条件地修改状态代码。
jest.mock('https', () => ({
...jest.requireActual('https'), // import and retain the original functionalities
request: (post_option, cb) => {
console.log('post_option-->',post_option);
if (post_option.host == 'api1_Host.com') {
cb({
setEncoding: jest.fn(),
on: (data, cb) => cb(Buffer.from(resp_1, 'utf8')),
statusCode: 200,
statusMessage: 'Mock API 1 Success'
})
} else {
cb({
setEncoding: jest.fn(),
on: (data, cb) => cb(Buffer.from(resp_2, 'utf8')),
statusCode: 400,
statusMessage: 'Mock API 2 Failed'
})
}
},
on: jest.fn(),
write: jest.fn(),
end: jest.fn()
}));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.