TypeError:使用 React、Storybook 和 Storyshots 插件进行快照测试时,提供的值不是“元素”类型

Posted

技术标签:

【中文标题】TypeError:使用 React、Storybook 和 Storyshots 插件进行快照测试时,提供的值不是“元素”类型【英文标题】:TypeError: The provided value is not of type 'Element' when snapshot testing with React,Storybook and Storyshots addon 【发布时间】:2021-03-07 05:32:50 【问题描述】:

在下面测试我的IndeterminateCheckbox 组件时出现``错误:

import  Checkbox  from '@chakra-ui/core';
import React from 'react';

export interface IndeterminateCheckboxProps 
  indeterminate: boolean;
  checked: boolean;
  title: string;
  onChange: () => void;


const IndeterminateCheckbox = React.forwardRef(
  (
     indeterminate, checked, title, onChange : IndeterminateCheckboxProps,
    forwardedRef: any
  ): JSX.Element => 
    return (
      <Checkbox
        colorScheme="brand.blue"
        isIndeterminate=indeterminate
        isChecked=checked
        onChange=onChange
        name=title
        sx= mt: '4px', borderColor: 'brand.grey.100' 
      />
    );
  
);

export default IndeterminateCheckbox;

我正在使用带有以下故事的 Storyshots 插件进行快照测试:

/* eslint-disable react/jsx-props-no-spreading */
import React from 'react';
import  Meta, Story  from '@storybook/react/types-6-0';
import IndeterminateCheckbox, 
  IndeterminateCheckboxProps,
 from './IndeterminateCheckbox';

export default 
  title: 'IndeterminateCheckbox',
  component: IndeterminateCheckbox,
  argTypes: 
    indeterminate: 
      control: 
        type: 'boolean',
      ,
    ,
    checked: 
      control: 
        type: 'boolean',
      ,
    ,
    title: 
      control: 
        type: 'string',
      ,
    ,
  ,
 as Meta;

const Template: Story<IndeterminateCheckboxProps> = args => (
  <IndeterminateCheckbox ...args />
);

export const Unchecked = Template.bind();
Unchecked.args = 
  indeterminate: false,
  title: 'unchecked',
  checked: false,
  onChange: () => null,
;

export const Checked = Template.bind();
Checked.args = 
  indeterminate: false,
  title: 'checked',
  checked: true,
  onChange: () => null,
;

export const Indeterminate = Template.bind();
Indeterminate.args = 
  indeterminate: true,
  title: 'indeterminate',
  checked: false,
  onChange: () => null,
;

任何想法可能导致这种情况?

【问题讨论】:

【参考方案1】:

您必须更新 storyshots 配置以支持将 refs 传递给它们的元素:

react-test-renderer 不提供渲染组件的引用。默认情况下,当引用 refs 时它返回 null。为了模拟依赖 refs 的元素,你必须使用从 15.4.0 版本开始添加到 React 的 createNodeMock 选项。 https://www.npmjs.com/package/@storybook/addon-storyshots#using-createnodemock-to-mock-refs

【讨论】:

以上是关于TypeError:使用 React、Storybook 和 Storyshots 插件进行快照测试时,提供的值不是“元素”类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 React 测试库模拟上下文提供程序时出现“TypeError:react.useContext 不是函数”

使用 React.js 存储错误 - TypeError: Object(...) is not a function react

TypeError: email.indexOf 不是 React 中使用 react-mailchimp-subscribe 的函数

React - TypeError:无法读取未定义的属性“img”

在 React Native 中使用 useContext 的上下文 API 显示 TypeError

未处理的拒绝(TypeError):在 React 中使用 useRef 时无法读取未定义的属性(读取“值”)