初学 jest | 青训营笔记

107 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 10 天,之前简单的写了一个 React 组件,接下来就是要对组件编写测试代码,今天先浅学一下如何使用 jest 编写测试代码。

jest 测试

为什么要进行测试

测试在整个软件开发过程中起到了非常重要的作用,它可以帮助我们发现代码中的 bug,提高代码的质量。测试可以分为单元测试、集成测试、端到端测试等,对于组件库这样模块化程度较高的项目,单元测试是最基本需要进行的测试。

什么是 jest

jest 是 Facebook 开发的一个 JavaScript 测试框架,它可以让我们在不使用浏览器的情况下,对 JavaScript 代码进行测试。

react-testing-library 和 jest-dom

React-Testing-Library是一个React应用的测试库,它的目的是测试React应用的用户行为。通过模拟用户的操作来测试React组件,从而验证应用是否能够正常工作。

Jest-dom是一个Jest的扩展库,它为Jest提供了专用于DOM操作的断言,使开发人员更方便地测试React组件中的DOM状态。例如,可以使用jest-dom库的toHaveTextContent()断言来测试元素是否具有指定的文本内容。

例子

一个计数器的简单组件:

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      <p>Count: {count}</p>
    </div>
  );
}

export default Counter;

测试代码:

import React from 'react';
import { render, fireEvent } from 'react-testing-library';
import 'jest-dom/extend-expect';
import Counter from './Counter';

describe('Counter', () => {
  it('increments count when button is clicked', () => {
    const { getByText } = render(<Counter />);
    const button = getByText('Increment');
    const count = getByText('Count: 0');

    fireEvent.click(button);

    expect(count).toHaveTextContent('Count: 1');
  });
});

在测试代码中,我们使用了 render() 方法来渲染组件,它会返回一个对象,这个对象包含了组件中的所有元素,我们可以通过 getByText() 方法来获取元素。然后我们使用 fireEvent() 来模拟用户的操作,最后使用 expect() 来断言元素的状态。

在测试中,我们将代码的预期结果以及实际的代码行为作比较,希望能够尽早发现并修复 bug ,相较于写完代码手动一遍遍的测试各种可能性,使用测试代码显然更加优雅可靠。