Reactjs 如何为React无状态功能组件模拟api?
我正在尝试测试一个无状态函数React组件,该组件在useEffect生命周期挂钩期间进行提取调用。我想创建一个模拟api文件,它将在运行Jest单元测试时拦截此调用,但我没有运气尝试实现这一点 我的组件:App.jsReactjs 如何为React无状态功能组件模拟api?,reactjs,mocking,jestjs,fetch,Reactjs,Mocking,Jestjs,Fetch,我正在尝试测试一个无状态函数React组件,该组件在useEffect生命周期挂钩期间进行提取调用。我想创建一个模拟api文件,它将在运行Jest单元测试时拦截此调用,但我没有运气尝试实现这一点 我的组件:App.js import React, { useState, useEffect } from 'react'; import Form from './Form'; import Image from './Image'; import unsplash from '../service
import React, { useState, useEffect } from 'react';
import Form from './Form';
import Image from './Image';
import unsplash from '../services/unsplash';
function App() {
const [deStat, setDeStat] = useState({
term: '',
images: [],
status: 'initial'
});
const fetchImages = async term => {
setDeStat({
status: 'searching',
term: term,
images: []
});
try {
const images = await unsplash(term);
setDeStat({
status: 'done',
images
});
} catch (error) {
setDeStat({
status: 'error'
});
}
};
useEffect(() => {
fetchImages('Mountains');
}, []);
return (
<div className="App">
<Form fetchImages={fetchImages} />
{deStat.status === 'searching' && <h3>Searching for {deStat.term}</h3>}
{deStat.status === 'done' && deStat.images.length === 0 && (
<h3>
Sorry sucker, no results{' '}
<span role="img" aria-label="sad">
You need to use act()
to flush async events.
https://reactjs.org/docs/test-utils.html#act
Also make your test async
like so it
("should blah", async () => {}
import React,{useState,useffect}来自“React”;
从“./Form”导入表单;
从“./Image”导入图像;
从“../services/unsplash”导入unsplash;
函数App(){
常量[deStat,setDeStat]=useState({
术语:“”,
图像:[],
状态:“初始”
});
const fetchImages=async term=>{
设定目标({
状态:“正在搜索”,
任期:任期,,
图片:[]
});
试一试{
常量图像=等待取消闪烁(术语);
设定目标({
状态:“完成”,
图像
});
}捕获(错误){
设定目标({
状态:“错误”
});
}
};
useffect(()=>{
获取图像(“山脉”);
}, []);
返回(
{deStat.status=='search'&&search for{deStat.term}
{deStat.status=='done'&&deStat.images.length==0&&(
抱歉,没有结果{'}
您需要使用act()
刷新异步事件。
也要使您的测试async
像这样
同样在模拟中,在async
wait
是冗余的。请使用其中一个。您需要使用act()
来刷新异步事件。
也要使您的测试async
像这样
同样在模拟中,在async
wait
是多余的。请使用一个或另一个。您能更具体地说明如何将act()
与无状态功能组件一起使用吗?您提供的链接中的示例用于基于类的组件,它们的功能肯定不同。也许您可以更改我现有的代码,以演示如何使用act()
正确吗?谢谢你的帮助!@JeremyMoritzact
取代了setTimeout
,因为它将清除任何基于时间的副作用(异步)。无需更改组件。无需调用wrapper.update()我还注意到您正在从服务调用unsplash。只要服务使用unsplash lib,您的模拟就应该是fine@JeremyMoritzMocks文件夹中的Mocks会自动模拟您的依赖项。结构应为\uuuuMocks\uuuuu/services/unsplash您需要重做该结构。您能否更具体地说明如何使用act()
使用无状态功能组件?您提供的链接中的示例用于基于类的组件,它们的功能肯定不同。也许您可以修改我现有的代码,以演示如何使用act()
正确吗?谢谢你的帮助!@JeremyMoritzact
取代了setTimeout
,因为它将清除任何基于时间的副作用(异步)。无需更改组件。无需调用wrapper.update()我还注意到您正在从服务调用unsplash。只要服务使用unsplash lib,您的模拟就应该是fine@JeremyMoritzMocks文件夹中的Mocks会自动模拟您的依赖项。结构应为u Mocks\uu\u/services/unsplash您需要重做该结构。