使用 Jest 测试 Express 中间件

Enr*_*dez 3 javascript testing node.js express jestjs

我正在尝试用 Jest 测试我的控制器(快速中间件)。为了解释我的问题,我将提供我的代码:

import request from 'utils/request';
import logger from 'config/logger';

const get = async (req, res, next) => {
  try {
    const response = await request.get('entries?content_type=category');
    return res.json(response.data);
  } catch (error) {
    logger.error(error.response.data.message);
    return next(error);
  }
};

module.exports = {
  get,
};
Run Code Online (Sandbox Code Playgroud)

我需要测试这个get功能。为此,我需要为其提供req,res和args。next我发现这个问题,操作员谈论嘲笑明确的请求,然后说“如何使用它”,但我不知道如何使用。这是迄今为止我看到的唯一与我的问题直接相关的主题,但答案对我不起作用(我不想使用 Nock 或任何其他库来实现测试,只是开玩笑)。

那么,如何才能成功测试这个功能呢?是通过模拟还是有其他方法?

抱歉我的英语不好,提前感谢您的帮助!

And*_*lan 5

如果您正在编写单元测试,那么模拟是更合适的方法。使用 Jest,Mocking 应该是开箱即用的。在测试文件中,它可能看起来像这样:

import request from 'utils/request';
import logger from 'config/logger';
import { get } from 'middleware/get'; // Or whatever file you are testing

jest.mock('request'); // Mocking for a module import
jest.mock('logger'); // Mocking for a module import

const mockReq = () => {
  const req = {};
  // ...from here assign what properties you need on a req to test with
  return req;
};

const mockRes = () => {
    const res = {};
    res.status = jest.fn().mockReturnValue(res);
    res.json = jest.fn().mockReturnValue(res);
    return res;
};

test('should return a json response of data', () => {
    const mockedNext = jest.fn();
    const mockedReq = mockReq();
    const mockedRes = mockRes();
    const mockedEntries = {
        data: {}
    };/*...whatever mocked response you want back from your request*/
    request.get.mockResolvedValue(mockedEntries);

    const result = get(mockedReq, mockedRes, mockedNext);

    expect(result).to.equal(mockedEntires.data);
    expect(mockedNext.mock.calls.length).toBe(1);
    expect(mockedRest.json).toHaveBeenCalledWith(mockedRes.data)
});
Run Code Online (Sandbox Code Playgroud)

开玩笑嘲笑