通过提交按钮测试axios响应数据触发器的简单方法

Posted

技术标签:

【中文标题】通过提交按钮测试axios响应数据触发器的简单方法【英文标题】:React simple way to test axios response data trigger by submit button 【发布时间】:2022-01-24 01:08:39 【问题描述】:

有没有简单的方法可以通过提交按钮测试axios响应数据触发?

一般来说,一旦它是稍微复杂或异步的测试,我真的会遇到麻烦。是否有一个简单的工具可以让我以简单流畅的方式创建测试?

import React,  useEffect, useState  from "react"
import axios from "axios"
   const ContactForm = () => 

      const onSubmitFormHandler = (event) => 
      const url = process.env.REACT_APP_SERVER_API + "/lead"

      try 
      axios
      .post(url, 
       headers: 
         "Content-Type": "application/json",
       ,
       params: 
        data: leadObj,
       ,
     )
     .then(function (response) 
      if (response.status === 200) 
         // do simething 
     
       else 
       // do simething else
      
     )
     .catch((error) => 
   
     )
   
 
  return (
      <form onSubmit=onSubmitFormHandler>
              <button data-testid="submit" type="submit">
                !loader ? "send" : <Loader />
              </button>     
      </form>
    )
  
export default ContactForm

【问题讨论】:

将 axios 代码放在一个单独的文件/模块中,并将其导入上面的代码中,然后从提交处理程序中调用它。然后,您可以很容易地测试单独的文件/模块。 【参考方案1】:

我将尝试详细解释它,以便您更快地了解这个想法,并且对您来说似乎不再复杂。要测试你的 API 服务与 ReactApp 的交互,你应该模拟 API 服务方法/承诺交互的不同情况,所以它要么是成功的,有一些数据,要么是失败的,要么是挂起的。

在过去漫长的日子里,我们创建了一个假客户端,我们在其中伪造调用并返回模拟数据,类似于处理真实调用时 API 向您的应用返回的数据。 例如,我们可以使用。 jest.mock 然后你为你的承诺做一个解决或拒绝。 (看下面的例子)

jest.mock("../api/users", () =&gt; ( getUsers: jest.fn(() =&gt; Promise.resolve(users)) ));

现在,更好的方法是使用 msw/node,这是一个 npm 包,它在你的 react 应用程序测试中为服务器模拟。因为它是 react-testing-library 文档推荐的,所以我会选择它,你可以在这里找到所有相关信息:

https://docs.dennisokeeffe.com/mock-service-worker/msw-with-react https://mswjs.io/docs/api/setup-server

【讨论】:

【参考方案2】:

这是一个直接来自 react-testing-library 文档的示例,我认为您可以很容易地使用上面的代码示例重新实现它。 (查看下面的链接了解更多详情!)

https://testing-library.com/docs/react-testing-library/example-intro/

您应该可以将您的网址替换为以下/greetings

当您的 api 返回 200 时,您需要做一些事情,也许像下面示例中的警报可能是一个好的开始?除非您刚刚清除了结果供我们在此处查看。

如果您的 onSubmit 是触发器,您还应该能够使用 screen.getByTestId 而不是 screen.getByText

react-testing-library 有一些很棒的文档,还有一个 Discord 社区,你也可以加入!希望这会有所帮助。祝你好运!

// __tests__/fetch.test.js
import React from 'react'
import rest from 'msw'
import setupServer from 'msw/node'
import render, fireEvent, waitFor, screen from '@testing-library/react'
import '@testing-library/jest-dom'
import Fetch from '../fetch'

const server = setupServer(
  rest.get('/greeting', (req, res, ctx) => 
    return res(ctx.json(greeting: 'hello there'))
  ),
)

beforeAll(() => server.listen())
afterEach(() => server.resetHandlers())
afterAll(() => server.close())

test('loads and displays greeting', async () => 
  render(<Fetch url="/greeting" />)

  fireEvent.click(screen.getByText('Load Greeting'))

  await waitFor(() => screen.getByRole('heading'))

  expect(screen.getByRole('heading')).toHaveTextContent('hello there')
  expect(screen.getByRole('button')).toBeDisabled()
)

test('handles server error', async () => 
  server.use(
    rest.get('/greeting', (req, res, ctx) => 
      return res(ctx.status(500))
    ),
  )

  render(<Fetch url="/greeting" />)

  fireEvent.click(screen.getByText('Load Greeting'))

  await waitFor(() => screen.getByRole('alert'))

  expect(screen.getByRole('alert')).toHaveTextContent('Oops, failed to fetch!')
  expect(screen.getByRole('button')).not.toBeDisabled()
)

【讨论】:

以上是关于通过提交按钮测试axios响应数据触发器的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

VueJS 方法没有从 Axios 返回响应

开玩笑的单元测试不会等待 axios 响应

ajax与jQuery的异步提交,他在啥情况下会走error

使用axios发送表单数据

捕获太长的表单提交

onsubmit表单提交简单使用