扩展Jest的“自动模拟”功能

时间:2018-09-13 23:03:26

标签: mocking jestjs

上下文

Jest的“自动模拟”功能非常有用。我不必为每个类都创建手写模拟,我可以这样做:

jest.mock('./src/MyObject')

...并且我有一个模拟对象,该对象具有所有正确的功能,都被模拟了。

请注意,我没有提到“自动模拟”功能,该功能甚至不需要您调用jest.mock(),而是通过调用jest.mock()时出现的自动功能将其提升到另一个层次。而不传递模拟工厂(即,仅传递一个参数时)。

目标

我希望能够略微自定义此自动嘲笑行为,而又不会失去所有上述魔力。对于上下文,我正在尝试使Jest与第三方框架很好地兼容,但这是一些简化的要求:

  • 直接更换。您仍然致电jest.mock(),仍然导入 类正常,等等。测试编写者忽略了 定制。
  • 目标对象的所有功能仍然 自动嘲笑。如果我向该对象添加函数,则不需要 更新模拟。
  • 如果目标对象具有名为awesomeFunction()的函数,我希望将其自动模拟以返回字符串“ awesome”。 (人为警告示例!)

我被困在哪里

我设法创建了一个使用jest.genMockFromModule()的函数,该函数调用此自动模拟行为。然后,我可以根据需要修改此模拟(例如模拟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语句也被提升。

我觉得我真的很近。有关如何进行的任何建议?

0 个答案:

没有答案