jest.fn() 旨在解决什么范围的问题?

What range of problems jest.fn() is intended to solve?

也许我太笨了,但我无法理解 jest.fn() 的确切作用以及它的用法。我是测试新手,我基本上掌握了 jest 的大部分功能,但是 jest.fn() 让我发抖。

我试图参考文档、观看教程,但目前我只知道 jest.fn() 可以监视函数或方法。

如果我们可以用 .toBe 或 .toEqual 检查返回值,用 .toBeDefined() 检查它的存在,用 .toBeCalledWith() 检查它的参数,为什么我们需要它?

我为此苦苦挣扎了大约一个星期。我确实遗漏了一些东西,但我没有人可以问。

模拟和存根旨在解决的问题是,您通常不想真正调用测试中的某些方法或依赖项,因为:

  • 它们不可靠,例如 http 请求:

    如果你有一个模块而不是显示从互联网上获取的用户列表,当你测试你的模块时,你不希望你的测试由于网络连接不良、缺少凭据等而失败

  • 它们很难在您的测试中设置:

    有些模块或依赖项需要很多parameters/setup条件才能被被测模块使用,因此测试起来困难且容易出错。通过模拟或存根这种依赖关系,您可以测试被测模块的逻辑,而无需处理管理依赖关系需求的负担。

  • 他们有自己的测试:

    如果您正在测试一个依赖于 i18n 模块的轮播模块,并且您已经测试了您的 i18n 模块,您不想再次测试它是否正常工作.你模拟它,所以你可以自由地设置 i18n 模块和依赖项。

  • 它们的计算量很大:

    假设您要测试 react/Angular/Vue... 显示网络视频游戏的 UI 仪表板和菜单的组件。当您测试游戏仪表板的导航栏是否按预期运行时,您绝对不想真正玩游戏 运行。

因此,在测试时,您最终会模拟和存根大量依赖项,它们应该是执行 http 调用的函数还是结构模块(如通量存储或 i18n 插件)。

jest.fn() 特别是在函数级别执行此操作。例如,您正在测试一个 vue 组件,该组件在其 created() 挂钩中调用了一些执行您不想在测试中处理的事情的方法:

也许它会调用 API,破坏本地存储或做一些计算密集型的事情。所以你监视那个方法放置 jest.fn() 在它的位置,你只是断言 它在应该 .

的时候被调用