[React Testing] Mock HTTP Requests with jest.mock in React Component Tests

If you have a component that makes HTTP requests, you’ll probably want to mock those out for UI unit and integration tests. Let’s see how to use jest’s built-in mocking capabilities to do that.

 

Component:

复制代码
import React from 'react'
import { loadGreeting } from './api'

function GreetingLoader() {
  const [greeting, setGreeting] = React.useState('')
  async function loadGreetingForInput(e) {
    e.preventDefault()
    const { data } = await loadGreeting(e.target.elements.name.value)
    setGreeting(data.greeting)
  }
  return (
    <form onSubmit={loadGreetingForInput}>
      <label htmlFor="name">Name</label>
      <input id="name" />
      <button type="submit">Load Greeting</button>
      <div aria-label="greeting">{greeting}</div>
    </form>
  )
}

export { GreetingLoader }
复制代码

 

API:

复制代码
const sleep = (time) =>
  new Promise((resolve) => {
    setTimeout(resolve, time)
  })

const greetings = ['Hello', 'Hi', 'Hey there', `What's up`, 'Howdy', `G'day`]

async function loadGreeting(subject) {
  return { data: { greeting: `${await fetchRandomGreeting()} ${subject}` } }
}

async function fetchRandomGreeting() {
  await sleep(1000)
  return greetings[Math.floor(Math.random() * greetings.length)]
}
复制代码

 

Testing:

复制代码
import React from 'react'
import { render, fireEvent, waitFor } from '@testing-library/react'
import { loadGreeting as mockLoadGreeting } from '../extra/api'
import '@testing-library/jest-dom/extend-expect'
import { GreetingLoader } from '../extra/greeting-loader-01-mocking'
// mock all the export from api module
jest.mock('../extra/api')

test('loads greeting on click', async () => {
  const testGreeting = 'TEST_GREETING'
  // Mock the data return
  mockLoadGreeting.mockResolvedValueOnce({ data: { greeting: testGreeting } })
  const { getByLabelText, getByText } = render(<GreetingLoader />)
  const nameInput = getByLabelText(/name/i)
  const loadButton = getByText(/load/i)
  nameInput.value = 'Mary'
  fireEvent.click(loadButton)
  expect(mockLoadGreeting).toHaveBeenCalledWith('Mary')
  expect(mockLoadGreeting).toHaveBeenCalledTimes(1)
  // using waitFor until to avoid warning from React
  await waitFor(() =>
    expect(getByLabelText(/greeting/i)).toHaveTextContent(testGreeting),
  )
})

afterEach(() => {
  jest.clearAllMocks()
})
复制代码

 

posted @   Zhentiw  阅读(297)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2018-04-30 [Python] Create a minimal website in Python using the Flask Microframework
2018-04-30 [GraphQL] Apollo React Mutation Component
2017-04-30 [Angular Unit Testing] Shallow Pipe Testing
2017-04-30 [Angular Unit Testing] Testing Pipe
点击右上角即可分享
微信分享提示