如何使用 react-testing-library 测试 React 组件的 css 属性?

srk*_*srk 5 css reactjs react-testing-library

react-testing-library 背后的理念对我来说很有意义,但我正在努力将它应用于 css 属性。

例如,假设我有一个简单的切换组件,单击时显示不同的背景颜色:

import React, { useState } from "react";
import "./Toggle.css";

const Toggle = () => {
  const [ selected, setSelected ] = useState(false);
  return (
    <div className={selected ? "on" : "off"} onClick={() => setSelected(!selected)}>
      {selected ? "On" : "Off"}
    </div>
  );
}

export default Toggle;
Run Code Online (Sandbox Code Playgroud)
.on {
  background-color: green;
}

.off {
  background-color: red;
}
Run Code Online (Sandbox Code Playgroud)

我应该如何测试这个组件?我编写了以下测试,它适用于内联组件样式,但在使用 css 类时失败,如上所示。

import React from "react";
import { render, screen, fireEvent } from "@testing-library/react";
import Toggle from "./Toggle";

const backgroundColor = (element) => window.getComputedStyle(element).backgroundColor;

describe("Toggle", () => {
  it("updates the background color when clicked",  () => {
    render(<Toggle />);
    fireEvent.click(screen.getByText("Off"));
    expect(backgroundColor(screen.getByText("On"))).toBe("green");
  });
});
Run Code Online (Sandbox Code Playgroud)

Dev*_*427 3

所以这不是单元或集成测试框架所做的。他们只测试逻辑。

如果您想测试样式,那么您需要一个端到端/快照测试框架,例如 Selenium。

  • 实际上有很大的不同。检查禁用就是检查正在添加的属性——这是逻辑。您要做的是检查非内联样式。如果您不会在单元/集成测试中测试样式,为什么要尝试查看元素是否是绿色的?这是一个造型测试。虽然您可以测试内联样式,但这是因为它是通过属性附加到元素的样式。CSS 需要一个类似浏览器的环境来将样式表与 HTML 相匹配。这只是基本的 HTML/CSS 内容。除非您加载 CSS(单元测试不会),否则无法找到样式。 (2认同)