mocking - 扩展 Jest 的“自动模拟”功能
问题描述
语境
Jest 的“自动模拟”功能非常有用。我不必为每个班级创建手写模拟,我可以这样做:
jest.mock('./src/MyObject')
...而且我有一个模拟对象,它具有所有正确的功能,都被模拟出来了。
请注意,我没有提到“自动模拟”功能,它甚至不需要您调用jest.mock()
,而是将其提升到另一个级别,而是在您调用jest.mock()
而不传递模拟工厂时发生的自动功能(即仅传递一个参数时) .
目标
我希望能够稍微自定义这种自动模拟行为,而不会失去上述所有魔力。对于上下文,我试图让 Jest 与第三方框架很好地配合,但这里有一些简化的要求:
- 即插即用更换。您仍然调用
jest.mock()
,您仍然正常导入类,等等。测试编写者忘记了自定义。 - 目标对象的所有功能仍然自动模拟。如果我向该对象添加函数,我不需要更新模拟。
- 如果目标对象有一个名为 的函数
awesomeFunction()
,我希望它被自动模拟以返回字符串“awesome”。(人为的示例警报!)
我被困在哪里
我设法创建了一个函数,该函数使用jest.genMockFromModule()
它调用这种自动模拟行为。然后我可以在我认为合适的时候修改这个模拟(例如 mocking awesomeFunction()
)。最后我可以使用jest.setMock()
.
mockAwesomely()
我现在可以在我的测试代码中使用这个函数(我们称之为):
import MyModule from './src/MyModule'
mockAwesomely('./src/MyModule') // used to be jest.mock('./src/MyModule')
问题是,使用此代码,导入MyModule
的不是模拟模块。这是真实的MyModule
。经过一番调查,我相信这是因为mockAwesomely()
没有像现在一样被提升到文件的顶部jest.mock()
。即使手动将它放在文件的顶部似乎也不起作用,因为import
语句也被提升了。
我觉得我真的很亲近。关于如何进行的任何建议?
解决方案
推荐阅读
- mysql - 这两个是不同的 ```RLIKE ^[^aeiou]``` 和 ```NOT RLIKE ^[aeiou]```?
- ruby-on-rails - 验证给我不正确的结果
- php - 如何使用 html 'id' 属性访问 php 页面中的表单详细信息
- android - 弹出菜单在 Android 中无法按预期工作
- graphql - 如何在 apollo-client 中使用枚举?
- jaws-screen-reader - 为什么 JAWS 不阅读整个句子?
- ios - 将 UI 图像定位在 UI 标签的文本“中间”
- javascript - 检索 React.js 元素的 ID
- angular - 如何循环遍历 html 中的 Set
- scala - 如何在 Scala Dataframe 中显示分组数据