【问题标题】:Testing an express middleware with Jest使用 Jest 测试快速中间件
【发布时间】:2020-03-17 12:17:13
【问题描述】:

我正在尝试使用 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,
};

我需要测试这个get 函数。为此,我需要向它提供 reqresnext 参数。我找到了this question,操作员在其中谈论模拟快速请求,然后说“如何使用它”,但我看不出如何使用。这是迄今为止我看到的与我的问题直接相关的唯一主题,但答案对我不起作用(我不想使用 Nock 或任何其他库来完成测试,只是开玩笑)。

那么,我怎样才能成功地测试这个功能呢?是通过 mocking 还是有其他方法?

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

【问题讨论】:

    标签: javascript node.js express testing jestjs


    【解决方案1】:

    如果您正在编写单元测试,那么模拟是更合适的方式。使用 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)
    });
    

    Jest Mocking

    【讨论】:

    • 该解决方案抛出下一条错误消息:Cannot find module 'logger' from 'controller.test.js 这里:jest.mock('logger');
    • 我不知道你的项目文件结构。您必须在进口时考虑到这一点
    • 我解决了这个问题,但结果 const:ReferenceError: get is not defined 出现错误
    • 啊,可能需要以{ get } from 'middleware/get 或中间件的任何路径进行导入
    • 不得不修改导入并将async 添加到测试函数以及awaitget 调用,因为此函数返回一个承诺。无论哪种方式,测试都直接进入指示下一条错误消息的 catch 块:TypeError: Cannot read property 'data' of undefinedlogger.error(error.response.data.message);
    猜你喜欢
    • 2020-12-27
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2022-10-17
    • 2016-02-12
    • 2020-05-17
    相关资源
    最近更新 更多