繁体   English   中英

Mocking 多个 Http 在 NodeJs 中使用 Jest 发布请求

[英]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 现在,

  • 对于 api_resp_1,我想将 statusCode 发送为 200。
  • 对于 api_resp_2,我想将 statusCode 发送为 400。

我试图模拟如下:

  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 请求。 我想发送不同的状态码。

试过了

  • mockResolvedValueOnce
  • mockReturnValueOnce 等

那么,如何模拟多个 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM