通过提交按钮测试 axios 响应数据触发的反应简单方法
React simple way to test axios response data trigger by submit button
有没有简单的方法来测试提交按钮触发的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
这是一个直接来自 react-testing-library 文档的示例,我认为您可以很容易地使用上面的代码示例重新实现它。 (查看下面的 link 了解更多详情!)
https://testing-library.com/docs/react-testing-library/example-intro/
您应该可以用下面的 /greetings
替换您的 url
当您的 api returns 为 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()
})
我将尝试详细解释它,以便您更快地理解这个想法,并且对您来说似乎不再复杂。要测试您的 API 服务与 ReactApp 的交互,您应该模拟 API 服务 method/promise 交互的不同情况,因此它要么是成功的一些数据,要么是失败或待定。
在过去漫长的日子里,我们创建了一个假客户端,我们在其中伪造调用和 return 类似于 API 在真实调用时返回给您的应用程序的模拟数据被处理。
我们可以使用例如。 jest.mock 然后你做出决定或拒绝你的承诺。 (看下面的例子)
jest.mock("../api/users", () => ({ getUsers: jest.fn(() => 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
有没有简单的方法来测试提交按钮触发的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
这是一个直接来自 react-testing-library 文档的示例,我认为您可以很容易地使用上面的代码示例重新实现它。 (查看下面的 link 了解更多详情!)
https://testing-library.com/docs/react-testing-library/example-intro/
您应该可以用下面的 /greetings
当您的 api returns 为 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()
})
我将尝试详细解释它,以便您更快地理解这个想法,并且对您来说似乎不再复杂。要测试您的 API 服务与 ReactApp 的交互,您应该模拟 API 服务 method/promise 交互的不同情况,因此它要么是成功的一些数据,要么是失败或待定。
在过去漫长的日子里,我们创建了一个假客户端,我们在其中伪造调用和 return 类似于 API 在真实调用时返回给您的应用程序的模拟数据被处理。 我们可以使用例如。 jest.mock 然后你做出决定或拒绝你的承诺。 (看下面的例子)
jest.mock("../api/users", () => ({ getUsers: jest.fn(() => 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