如果单个元素中有多个类名,如何在 React 测试中获得正确的类名?

Posted

技术标签:

【中文标题】如果单个元素中有多个类名,如何在 React 测试中获得正确的类名?【英文标题】:How to get the correct classname in React testing if there are multiple classnames in a single element? 【发布时间】:2021-11-10 13:36:25 【问题描述】:

我正在为反应组件(复选框)编写测试用例,因为我使用的是样式化组件,所以创建了多个类。 现在的问题是我需要编写测试用例,以便能够检查特定的类名('checkbox__default')。 下面是测试用例的代码:

describe("Checkbox variant", () => 
    it("Default variant", () => 
      render(<CheckBox variant="default" label="default variant" />);
      const checkbox = screen.getByText("default variant");
      expect(checkbox).toHaveClass("checkbox__default");
    );
  );

这是反应组件的代码

import React from "react";
import styled from "styled-components";
import PropTypes from "prop-types";
import  Wrapper  from "../../atoms";

const Input = styled.input``;
const Label = styled.label``;
// const baseClass = "checkbox";

const getClassName = (variant) => 
  switch (variant) 
    case "primary":
      return "checkbox__primary";
    case "secondary":
      return "checkbox__secondary";
    default:
      return "checkbox__default";
  
;

export const CheckBox = ( checked, handler, label, variant ) => (
  <Wrapper className=`checkbox $getClassName(variant)`>
    <Label aria-label=label>
      <Input type="checkbox" checked=checked onChange=handler />
      label
    </Label>
  </Wrapper>
);

CheckBox.defaultProps = 
  checked: false,
  handler: () => ,
  label: "",
  variant: "default",
;

CheckBox.propTypes = 
  label: PropTypes.string,
  checked: PropTypes.bool,
  handler: PropTypes.func,
  variant: PropTypes.oneOfType(["default", "primary", "secondary"]),
;

附上截图方便大家理解。

[![在此处输入图像描述][1]][1] 界面页面 [![在此处输入图像描述][2]][2] 测试结果 [1]:https://i.stack.imgur.com/a3m0u.png [2]:https://i.stack.imgur.com/Ilvh6.png

【问题讨论】:

【参考方案1】:

我自己的反应不是很熟练,但让我们试试吧:

这个类名:

className=`checkbox $getClassName(variant)`

会返回类似:checkbox checkbox__default,我假设您希望它是 checkbox__default。所以把它改成

className=getClassName(variant)

className=`$getClassName(variant)`

会返回正确的值。

现在,由于您的测试不知道正确的 className 值,因此按层次结构查找它是有意义的:

const  container  = render(<Checkbox variant="default".../>)
expected(container.firstChild).toHaveClass("checkbox__default")

【讨论】:

对不起,这个答案没有用。您不能仅仅将类名从实现中排除以使测试绿色。我们可以假设需要checkbox 来应用所有复选框通用的任何样式,而checkbox__default 是默认变体的类。

以上是关于如果单个元素中有多个类名,如何在 React 测试中获得正确的类名?的主要内容,如果未能解决你的问题,请参考以下文章

当元素包含多个类名时如何在硒中复制标签?

如何使用 React.createRef() 在 React 中访问多个 Dom 元素

如果有多个具有相同类名且没有资源 ID 的元素,如何检查元素

使用 React Hooks 更改元素类名称和兄弟姐妹

如何在 React 中组合多个类名?

如何获取具有多个类但只知道其中一个的元素的类名