也许我很笨,但是我无法理解jest.fn()的确切功能以及使用方法。我是测试的新手,基本上拥有jest的大多数功能,但是jest.fn()让我发抖。
我试图参考文档,观看教程,但目前我所知道的是jest.fn()可以监视函数或方法。
如果可以使用.toBe或.toEqual检查返回的值,使用.toBeDefined()检查其存在以及使用.toBeCalledWith()检查其参数,为什么需要它?
我为此苦了大约一个星期。我确实很想念什么,但是我没有人要问。
答案 0 :(得分:2)
模拟和存根旨在解决的问题是,您通常不想在测试中真正调用,因为:
它们是不可靠的,例如http请求:
如果您有一个模块而不是显示从互联网上获取的用户列表,则在测试模块时,您不希望由于网络连接不良,凭据不足等导致测试失败。
在您的测试中很难设置它们:
某些模块或依赖项需要大量参数/设置条件才能被测试模块使用,从而使测试变得困难且容易出错。通过模拟或存根这样的依赖关系,您可以测试被测模块的逻辑,而不必处理管理依赖关系需求的负担。
他们有自己的测试:
如果您要测试依赖于i18n模块的圆盘传送带模块,而您尚未测试i18n模块,请不要再次再次测试。您可以对其进行模拟,因此可以自由使用i18n模块的设置和依赖项。
它们的计算强度很高:
假设您要测试一个react / Angular / Vue ...组件,该组件显示用于Web电子游戏的UI仪表板和菜单。您绝对不想在测试游戏仪表盘的导航栏是否按预期运行时实际运行游戏。
因此,在测试过程中,您最终会嘲笑并添加很多依赖项,而这些依赖项应该是执行http调用或诸如磁通存储器或i18n插件之类的结构模块的函数。
jest.fn()
尤其是在功能级别上执行此操作。例如,您正在测试一个vue组件,该组件在其created()
钩子中调用某种执行您不想在测试中处理的方法的方法:
也许它调用了一个API,弄乱了本地存储或进行了一些计算密集的工作。因此,您监视了将jest.fn()
放在其位置的方法,而您只断言了该何时应调用它。