使用Jest测试Express应用时出现express.urlencoded不是函数的问题
解决Jest测试Express时
express.urlencoded不是函数的问题 这个问题的核心是你用jest.mock('express')自动mock了Express模块,但Jest的自动mock不会帮你构建Express原本的嵌套方法结构——默认情况下,express.urlencoded会被当成未定义或者非函数的值,所以测试时调用它就会报错,而实际运行时用的是真实的Express模块,自然没问题。
修复步骤:
手动模拟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; });修正测试用例的断言逻辑
你的实际代码里调用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
相关产品推荐
相关产品推荐

