node.js - 为什么在使用 Jest 进行测试时 express.urlencoded 不是函数?
问题描述
我正在使用 Jest 测试我的 app.js,它说它express.urlencoded
不是一个函数。
我正在使用 express 4.16.4,而我正在为 app.js 编写测试,看起来有点像这样
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(require('./routes'));
module.exports = app;
我的测试用例是:
jest.mock('express');
it('has a parser', () => {
const app = require('../src/app');
const express = require('express');
expect(app.use).toHaveBeenCalledWith(express.urlencoded());
});
这给了我一个错误说:express.urlencoded is not a function.
我希望这个测试能够通过,因为该应用程序运行良好,但只有在测试中它说 express.urlencoded 不是一个函数。
解决方案
您必须在那里手动提供要测试的工厂和模拟模块方法。这看起来像这样:
const urlencodedMock = jest.fn();
jest.mock('express', () => {
urlencoded: urlencodedMock,
});
it('has a parser', () => {
const app = require('../src/app');
const express = require('express');
expect(app.use).toHaveBeenCalledWith(urlencodedMock);
});
编辑:
我不熟悉快递,但你可以试试下面的例子。jest.mock()
将以它通过的方式模拟表达,express()
然后当该部分通过时在测试内部,它将再次模拟它,以提供json()
和urlencoded()
表达的功能。
jest.mock('express', () => {
return {
use: () => {
return;
}
}
});
it('has a parser', () => {
const jsonMock = jest.fn();
const urlencodedMock = jest.fn();
const app = require('../src/app');
jest.doMock('express', () => {
json: jsonMock,
urlencoded: urlencodedMock,
});
expect(app.use).toHaveBeenCalledWith(urlencodedMock);
});
推荐阅读
- elasticsearch - Elastic Search Cluster Config - 在一个物理上自动发现、配置和多弹性
- nginx - NGINX - 无法设置内容类型标头
- javascript - ReactiveSearch 的 ReactiveList 不会随着 ES 的变化而更新
- multithreading - 使用多线程处理器调试单线程应用程序的性能
- html - 保持选择选择颜色并添加png作为背景
- mysql - MySQL 查询优化 - 现有查询运行速度太慢
- php - JavaScript - 检查数据 id 是否等于函数参数
- apache-zookeeper - 无法启动 bin/zkCli.sh
- python - 如何使用 jmeter 测试 django web?
- python - NiFi中的输入flowFile没有可行的替代方案