Jest测试React Hooks的useEffect

蜗牛 互联网技术资讯 2024-08-29 11 0

useEffect 是 React Hooks 中的一个关键功能,它允许我们在函数组件中处理副作用,如数据获取、订阅或手动更改 DOM

以下是使用 Jest 和 React Testing Library 测试使用 useEffect 的 React 函数组件的示例:

  1. 首先,创建一个名为 MyComponent.js 的文件,其中包含使用 useEffect 的简单组件:
import React, { useState, useEffect } from 'react';

const MyComponent = () => {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch('/api/data')
      .then((response) => response.json())
      .then((data) => setData(data));
  }, []);

  return (
    <div>
      {data ? <div>Data: {JSON.stringify(data)}</div> : <div>Loading...</div>}
    </div>
  );
};

export default MyComponent;
  1. 然后,创建一个名为 MyComponent.test.js 的测试文件:
import React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import MyComponent from './MyComponent';

// Mock the fetch function
global.fetch = jest.fn(() =>
  Promise.resolve({
    json: () => Promise.resolve({ id: 1, title: 'Test Data' }),
  })
);

describe('MyComponent', () => {
  it('fetches and displays data on mount', async () => {
    render(<MyComponent />);

    // Expect to see the loading message
    expect(screen.getByText('Loading...')).toBeInTheDocument();

    // Wait for the data to be fetched and displayed
    await waitFor(() => screen.getByText(/Data:/i));

    // Expect to see the fetched data
    expect(screen.getByText(/Data:.*"id": 1/)).toBeInTheDocument();
    expect(screen.getByText(/Data:.*"title": "Test Data"/)).toBeInTheDocument();
  });
});

在这个例子中,我们使用了 Jest 的 jest.fn() 方法来模拟 fetch 函数。我们还使用了 @testing-library/reactrenderscreenwaitFor 函数来渲染组件并等待异步操作完成。最后,我们使用 expecttoBeInTheDocument 断言来验证组件的行为。

要运行此测试,请确保已安装所需的依赖项(如 jest@testing-library/react@testing-library/user-event),并在项目根目录中运行 npm testyarn test

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo6@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论Telegram