Reactjs 使用Jest模拟API调用设置状态

Reactjs 使用Jest模拟API调用设置状态,reactjs,testing,jestjs,axios,enzyme,Reactjs,Testing,Jestjs,Axios,Enzyme,我有一个API调用,它在某个组件装载时运行。如果此API调用成功,响应数据将用于更新我的某个React挂钩的状态 我遇到的问题要么与异步性有关,要么与格式不好的模拟API调用有关,但无论我尝试什么,我都无法使此测试正常工作 以下是API的简化版本: const getOrg =() => { axios.get(URL, config) .then(response => response.data) .then(data => { setOr

我有一个API调用,它在某个组件装载时运行。如果此API调用成功,响应数据将用于更新我的某个React挂钩的状态

我遇到的问题要么与异步性有关,要么与格式不好的模拟API调用有关,但无论我尝试什么,我都无法使此测试正常工作

以下是API的简化版本:

const getOrg =() => {
  axios.get(URL, config)
    .then(response => response.data)
    .then(data => {
       setOrgTitle(data.name)
    }
}
基本上会触发API,并根据响应更新my
setOrgTitle
hook

const [orgTitle, setOrgTitle] = useState("");
现在,在我的返回语句中,我显示了
orgTitle
的值:

<h1 className={styles.titleText} id="document-folders-h1">
  {orgTitle} Folders
</h1>
和我的测试文件:

import mockAxios from "../../mockTests/DocumentFoldersMock";

it("fetches results for getAdminOrg", () => {
  axios.get.mockImplementation(() =>
    Promise.resolve({ data: { name: "GETtest" } })
  );
  const wrapper = mount(
    <AppProviders>
      <DocumentFolders />
    </AppProviders>
  );
  const orgTitle = wrapper.find("#document-folders-h1");
  expect(orgTitle.text()).toContain("GETtest Folders");
});
从“../../mockTests/DocumentFoldersMock”导入mockAxios;
它(“获取getAdminOrg的结果”,()=>{
axios.get.mockImplementation(()=>
Promise.resolve({data:{name:“GETtest”}})
);
常量包装器=装入(
);
const orgTitle=wrapper.find(#document-folders-h1”);
expect(orgTitle.text()).toContain(“GETtest文件夹”);
});
我正在模拟响应数据,但是我不确定如何运行在实际axios调用的
中调用的
setOrgTitle
函数。如何使用模拟响应从模拟axios调用执行此操作


Jest测试的结果显示预期(“GETtest文件夹”)已收到(“文件夹”),因此我非常确定我在异步性方面存在问题,或者在调用钩子更新时存在问题。

您是否询问如何确保调用了
setOrgTitle
?因为在我看来,在测试中,通过查找带有名称的文本,您似乎已经在这样做了,只有在实际获取该文本时才会显示该文本。或者你的测试失败了?@Mikaela测试失败了,所以我假设setOrgTitle没有被调用。Jest响应表示预期(“GETtest文件夹”)已收到(“文件夹”)。我只是想弄清楚我是有异步问题,还是我的模拟APIse有问题!如何覆盖Axios?你导入了你的mock,但是你的钩子真的在调用它吗?即使是异步问题导致测试失败(例如,在文本更新之前卸载),仍应调用
get
方法。您也可以尝试在测试中使用模拟Axios。这是一个很好的问题,我不完全确定如何或是否真正调用了模拟。我尝试复制其他人用来模拟在
useffect
中发生的API调用的格式,但现在我深入查看,我根本不确定是否调用了我的模拟函数。您可以尝试在模拟的
get
方法中记录一些内容,看看是否调用过它。
import mockAxios from "../../mockTests/DocumentFoldersMock";

it("fetches results for getAdminOrg", () => {
  axios.get.mockImplementation(() =>
    Promise.resolve({ data: { name: "GETtest" } })
  );
  const wrapper = mount(
    <AppProviders>
      <DocumentFolders />
    </AppProviders>
  );
  const orgTitle = wrapper.find("#document-folders-h1");
  expect(orgTitle.text()).toContain("GETtest Folders");
});