javascript - 使用 Jest 进行快照测试时是否使用 toJSON

标签 javascript reactjs jestjs

我是 React 新手,我正在测试我的组件。在实现快照测试时,我发现了这两种方法:

方法 1

import React from 'react'
import renderer from 'react-test-renderer'
import Projects from './Projects'

it('renders Projects component properly', () => {
  const tree = renderer.create(<Projects />)
  expect(tree).toMatchSnapshot()
})

方法 2

import React from 'react'
import renderer from 'react-test-renderer'
import Projects from './Projects'

it('renders Projects component properly', () => {
  const component = renderer.create(<Projects />)
  const tree = component.toJSON()
  expect(tree).toMatchSnapshot()
})

在组件中调用 toJSON 是否重要(方法 2),或者您可以直接传递它来检查 toMatchSnapshot(方法 1)吗?有人可以向我解释一下这两种方法在性能方面的区别吗?

最佳答案

TL;DR

当使用toMatchSnapshot匹配器时,在传递给expect的对象上调用toJSON。它是某种检查链的一部分,对于绝大多数实际情况来说,对性能的影响可能可以忽略不计。我建议调用 toJSON 只是为了遵循“显式优于隐式”原则以及内部行为可能会发生变化的事实。

说明

matcher uses快照状态 match methodserializes目的。 serialize只需使用一组插件调用 Pretty-format 即可。

这是 pretty-format 的入口点,我在那里添加了评论:

function prettyFormat(
  val: unknown,
  options?: PrettyFormat.OptionsReceived,
): string {
  if (options) {
    validateOptions(options);
    if (options.plugins) {
      const plugin = findPlugin(options.plugins, val);
      /* When val is a result of `toJSON` call 
         it has a $$typeof: Symbol.for('react.test.json') field so  
         it is handled by ReactTestComponent plugin in this point */
      if (plugin !== null) {
        return printPlugin(plugin, val, getConfig(options), '', 0, []);
      }
    }
  }

  // When `toJSON` is not called `printBasicValue` is invoked but is it pointless
  const basicResult = printBasicValue(
    val,
    getPrintFunctionName(options),
    getEscapeRegex(options),
    getEscapeString(options),
  );
  if (basicResult !== null) {
    return basicResult;
  }

  return printComplexValue(val, getConfig(options), '', 0, []);
}

printBasicValue只是执行一组检查,所有这些检查都对某个对象失败,因此 printComplexValue轮到了。 这是调用 .toJSON() 的片段。

  if (
    config.callToJSON &&
    !hitMaxDepth &&
    val.toJSON &&
    typeof val.toJSON === 'function' &&
    !hasCalledToJSON
  ) {
    return printer(val.toJSON(), config, indentation, depth, refs, true);
  }

printer 找到一个插件并在一开始就调用它,所以这并不重要。

  const plugin = findPlugin(config.plugins, val);
  if (plugin !== null) {
    return printPlugin(plugin, val, config, indentation, depth, refs);
  }

您可以注意到,可以通过设置配置选项或其他一些条件来禁用调用 toJSON ,我认为这些条件对于快照的情况并不重要,但仍然如此。

关于javascript - 使用 Jest 进行快照测试时是否使用 toJSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61284054/

相关文章:

javascript - 用于显示分析图的 graph ui 库的建议

javascript - 使用 jQuery 创建 Messenger 应用程序(失败)

node.js - 将 React 应用程序和单独的 Node API 部署到生产 Ubuntu 服务器(其中使用 NGINX 提供 React 静态文件)后出现 COR 错误

css - 如何从 Material-UI 自定义 DateTimePicker

javascript - 在我的浏览器中加载后如何从我的本地机器测试网页

javascript - 以base64解码字符串并加载为数组JS

javascript - 为什么状态只有在变量赋值时才会消失?

babeljs - 为什么我的文件夹名称会影响 `npm test` 、 Jest 和 Babel ?

reactjs - 如何用 Jest 测试 useParam() 函数

javascript - jQuery : Passing a method directly to the on event handler isn't working