You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jest测试Express应用时出现express.urlencoded不是函数的问题

解决Jest测试Express时express.urlencoded不是函数的问题

这个问题的核心是你用jest.mock('express')自动mock了Express模块,但Jest的自动mock不会帮你构建Express原本的嵌套方法结构——默认情况下,express.urlencoded会被当成未定义或者非函数的值,所以测试时调用它就会报错,而实际运行时用的是真实的Express模块,自然没问题。

修复步骤:

  1. 手动模拟Express模块的完整结构
    替换原来的jest.mock('express'),手动定义mock的实现,确保express.json、express.urlencoded都是有效的mock函数,同时express()返回的app对象有use方法:

    jest.mock('express', () => {
      // 模拟express()返回的app实例
      const mockApp = {
        use: jest.fn()
      };
      // 模拟express的静态方法
      const mockExpress = jest.fn(() => mockApp);
      mockExpress.json = jest.fn();
      mockExpress.urlencoded = jest.fn();
      return mockExpress;
    });
    
  2. 修正测试用例的断言逻辑
    你的实际代码里调用express.urlencoded时传了{ extended: true }参数,所以断言要和这个匹配,而不是空调用。另外,加载app模块后,相关的mock函数就会被触发调用,调整后的测试用例如下:

    it('configures request parsers correctly', () => { 
      // 加载app,触发里面的配置代码
      const app = require('../src/app');
      const express = require('express');
    
      // 验证express.urlencoded是否被正确调用
      expect(express.urlencoded).toHaveBeenCalledWith({ extended: true });
      // 验证app.use是否使用了解析器
      expect(app.use).toHaveBeenCalledWith(express.json());
      expect(app.use).toHaveBeenCalledWith(express.urlencoded({ extended: true }));
    });
    

为什么这样能解决问题?

手动mock后,我们明确了Express模块各个部分的mock实现:

  • express()返回的mockApp有use方法,不会出现方法不存在的问题
  • express.json和express.urlencoded被定义为jest mock函数,调用时不会报错
  • 断言和实际代码的调用参数一致,保证测试的准确性

内容的提问来源于stack exchange,提问作者Sarmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:13:24