Reactjs 如何为React无状态功能组件模拟api?

Reactjs 如何为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

我正在尝试测试一个无状态函数React组件,该组件在useEffect生命周期挂钩期间进行提取调用。我想创建一个模拟api文件,它将在运行Jest单元测试时拦截此调用,但我没有运气尝试实现这一点

我的组件:App.js

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()
正确吗?谢谢你的帮助!@JeremyMoritz
act
取代了
setTimeout
,因为它将清除任何基于时间的副作用(异步)。无需更改组件。无需调用wrapper.update()我还注意到您正在从服务调用unsplash。只要服务使用unsplash lib,您的模拟就应该是fine@JeremyMoritzMocks文件夹中的Mocks会自动模拟您的依赖项。结构应为\uuuuMocks\uuuuu/services/unsplash您需要重做该结构。您能否更具体地说明如何使用
act()
使用无状态功能组件?您提供的链接中的示例用于基于类的组件,它们的功能肯定不同。也许您可以修改我现有的代码,以演示如何使用
act()
正确吗?谢谢你的帮助!@JeremyMoritz
act
取代了
setTimeout
,因为它将清除任何基于时间的副作用(异步)。无需更改组件。无需调用wrapper.update()我还注意到您正在从服务调用unsplash。只要服务使用unsplash lib,您的模拟就应该是fine@JeremyMoritzMocks文件夹中的Mocks会自动模拟您的依赖项。结构应为u Mocks\uu\u/services/unsplash您需要重做该结构。