如何使用 Jest 测试样式

Posted

技术标签:

【中文标题】如何使用 Jest 测试样式【英文标题】:How to test styling using Jest 【发布时间】:2021-02-14 16:39:08 【问题描述】:

我正在开发一个 React 项目,该项目使用 SASS(SCSS 语法)进行样式设置,并使用 Jest 进行单元测试。我在我的项目中测试样式时遇到问题。这是一个简单的例子:

在 component.js 中(导入单独的样式表)...

const Component = () => 
     return (
        <div className="greeting">Hello</div>
     )

在我的 .scss 文件中...

.greeting 
    background-color: red;

在我的测试文件中...

test('background color should be red', () => 
    render(<Component />);
    expect(screen.getByText('Hello')).toHaveStyle('background-color: red');
)

测试失败:

expect(element).toHaveStyle()

    - Expected

    - background-color: red;

但是,如果我使用内联样式 (&lt;div style=backgroundColor: red&gt;Hello&lt;/div&gt;),则测试通过。

有人遇到过这个问题吗?我还想知道其他人在 Jest 中测试样式的方法(特别是当您的样式保存在单独的 .scss 文件中时)

我正在使用来自@testing-library/domscreen 和来自@testing-library/reactrender 进行测试。

【问题讨论】:

Jest 也不适合测试不是 CSS-in-JS 的 CSS。我可能会研究视觉差异?! 【参考方案1】:

您可以使用window.getComputedStyle() 访问所有样式的最终结果,甚至是类中的样式。

在您的情况下,为了测试 div 元素最终的背景颜色,您将编写:

test('background color should be red', () => 
    render(<Component />);

    const element = screen.getByText('Hello');
    const styles = getComputedStyle(element);

    expect(styles.backgroundColor).toBe('red');
)

【讨论】:

【参考方案2】:

我同意多米尼克的观点。 Jest 非常适合测试呈现的 html 的属性。除非样式在 HTML 中(内联样式),否则 Jest 不会看到它(正如您所指出的)。在不内联样式的情况下,您可以进行的最深入测试是验证它是否具有正确的类名。

也许是在赛普拉斯之类的浏览器中运行的测试框架?阅读visual testing with Cypress。

【讨论】:

以上是关于如何使用 Jest 测试样式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React-Native 项目中使用 Jest 测试样式化组件?

如何使用 Jest 和/或 Enzyme 测试由 React 组件呈现的样式和媒体查询

如何测试嵌套组件的样式 jest-styled-components

使用 Jest-Enzyme 测试样式组件

如何使用 Jest/Enzyme 在功能性 React 组件中测试 lambda 函数?

无法让 Jest 使用包含主题的样式化组件