javascript - 为什么 Jest 仍然需要一个模拟模块?
问题描述
我正在使用 Jest 模拟一个模块,因为它包含不应在测试中运行的代码。但是我可以从输出中看到模块中的代码正在运行。
// foo.js
console.log('Hello')
// test.js
jest.mock('./foo')
const foo = require('./foo')
test.todo('write some tests')
控制台输出
PASS test.js
✎ todo 1 test
console.log foo.js:1
Hello
那是怎么回事?
解决方案
这让我绊倒了几次。
如果您不提供模拟实现,jest.mock
它将返回一个对象,该对象反映模拟模块的导出,但每个函数都替换为模拟jest.fn()
。这非常简洁,因为它通常是您想要的。但是为了确定模块的出口,它必须首先require
它。这就是导致console.log
运行的原因。
两种可能的解决方案:
- 不要在模块的顶层运行代码:而是导出一个运行代码的函数。
- 提供您自己的模拟实现,因此它不需要自省模块
jest.mock('./foo', () => {})
推荐阅读
- php - 重力形式:动态填充字段标签或占位符
- laravel-5 - 必要时,如何在 Laravel 中降级 npm 包?
- java - 将大型 csv 文件转换为 JSON 时,有什么方法可以解决 java 堆内存错误?
- go - 如何在 tcell 中获取输入
- python - 使用 python 模拟击键用于 P3D 飞行模拟器
- android - 在对象中初始化 sharedPreferences 时遇到问题
- c# - 如何使对 Image API 的 Get 请求起作用?
- gradle - 在 groovy 中拆分带有字符 %" 的字符串
- php - 如何在localhost php文件上使用sqlmap,如何放置参数?
- javascript - 单击保存时,角度材质对话框传递动态功能