如何在nodejs中用jest模拟异步方法

时间:2021-07-17 11:02:54

标签: node.js typescript express unit-testing jestjs

我有以下提到的文件

|_ utils.js |_methods.js

我正在为rest.js方法做单元测试,文件内容是

methods.js

import Express from 'express'
import { add_rec } from './utils'

export const create_rec = () => async (req: Express.Request, res: Express.Response) => {
    const rec_body = req.body.rec

    return add_rec(rec_body)
        .then((ret) => res.status(201).send(ret))
        .catch((e) => {
            res.status(500).send({ message: e.message })
        })
}

如何模拟 add_rec 异步函数以便我可以对我的 create_rec 进行单元测试 功能

我正在尝试以下面的方式测试 create_rec,但它不允许我模拟 add_rec 方法

mport { getMockReq, getMockRes } from '@jest-mock/express'
import { add_rec } from './utils'
jest.mock('./utils')

describe('test create_rec method valid param', () => {
    it('test create_rec method', async () => {
        const req = getMockReq({
            body: {
                rec: {},
            },
        })
        const { res } = getMockRes<any>({
            status: jest.fn(),
            send: jest.fn(),
        })
        add_rec.mockResolved({}) // this line is giving error in fact it is not mocked i think
        await create_rec()(req, res)
        expect(res.status).toHaveBeenCalledTimes(1)
        expect(res.send).toHaveBeenCalledTimes(1)
    })
})

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

你的代码基本正确,只是需要对mock方法的TS类型做一些处理,可以使用类型断言。

例如

<iframe>

methods.ts

import Express from 'express'; import { add_rec } from './utils'; export const create_rec = () => async (req: Express.Request, res: Express.Response) => { const rec_body = req.body.rec; return add_rec(rec_body) .then((ret) => res.status(201).send(ret)) .catch((e) => { res.status(500).send({ message: e.message }); }); };

utils.ts

export async function add_rec(params): Promise<any> { console.log('real implementation'); }

methods.test.ts

测试结果:

import Express from 'express';
import { create_rec } from './methods';
import { add_rec } from './utils';

jest.mock('./utils');

describe('68419899', () => {
  test('should pass', async () => {
    (add_rec as jest.MockedFunction<any>).mockResolvedValueOnce({});
    const req = ({ body: { rec: {} } } as unknown) as Express.Request;
    const res = ({ status: jest.fn().mockReturnThis(), send: jest.fn() } as unknown) as Express.Response;
    await create_rec()(req, res);
    expect(add_rec).toBeCalledWith({});
    expect(res.status).toBeCalledWith(201);
    expect(res.send).toBeCalledWith({});
  });
});