【问题标题】:how to check axios get function called or not in react js?如何在反应js中检查axios get函数是否被调用?
【发布时间】:2020-07-25 09:16:10
【问题描述】:

我正在尝试测试以下函数,或者换句话说,我正在尝试编写以下函数的单元测试用例。但是我收到错误 _axios.default.get.mockResolvedValueOnce is not a function

import React from "react";
import axios from "axios";
export default () => {
  const [state, setState] = React.useState([]);

  const fetchData = async () => {
    const res = await axios.get("https://5os4e.csb.app/data.json");
    setState(res.data);
  };

  React.useEffect(() => {
    (async () => {
      await fetchData();
    })();
  }, []);

  return [state];
};

这是我的代码 https://codesandbox.io/s/awesome-jepsen-5os4e?file=/src/usetabData.test.js

我就是这样写单元测试用例的

import useTabData from "./useTabData";
import { act, renderHook, cleanup } from "@testing-library/react-hooks";
import mockAxios from "axios";
describe("use tab data", () => {
  afterEach(cleanup);
  it("fetch tab data", async () => {
    mockAxios.get.mockResolvedValueOnce({
      data: {
        name: "hello"
      }
    });
    await act(async () => renderHook(() => useTabData()));
    expect(mockAxios.get).toHaveBeenCalled();
  });
});

【问题讨论】:

  • import mockAxios from "axios"; 看起来是 axios 的默认导出。您的意思是要导入它的 some 模拟版本吗?
  • 我正在尝试模拟 axios 。还有其他方法吗>
  • 看到我创建了__mocks___ 文件夹
  • @DrewReese 你明白我的意思了吗?
  • 是的,但不幸的是,我更喜欢使用组件进行测试,并在必要时按需模拟导入,因此我对 __mocks____tests__ 目录的经验很少。不过,您的问题似乎已得到解决。

标签: javascript reactjs jestjs axios react-hooks-testing-library


【解决方案1】:

据我所知,代码沙盒不支持手动模拟。 但是,您的 __mock__ 放置在错误的目录结构中。它应该是node_module 的兄弟。

话虽如此,最简单的方法是使用https://github.com/ctimmerm/axios-mock-adapter

import useTabData from "./useTabData";
import { act, renderHook, cleanup } from "@testing-library/react-hooks";
import axios from "axios";
import MockAxiosAdapter from "axios-mock-adapter";

const mockAxios = new MockAxiosAdapter(axios);
afterEach(() => {
    cleanup();// this is not needed . its done by testing library after each.
    mockAxios.reset();
  });
describe("use tab data", () => {
  it("fetch tab data", async () => {
    mockAxios.onGet(200, { data: { test: "123" } }); // response code and object.
    const { result, waitForNextUpdate } = renderHook(() => useTabData());
    const [value] = result.current;
    // assert value
    // assert the axios call by using history object
  });
});

您可以使用历史来断言:https://github.com/ctimmerm/axios-mock-adapter#history

【讨论】:

  • 能否请您尝试不同的方法来检查 setState 是否被调用 codesandbox.io/s/sweet-meadow-9l41z?file=/src/…
  • 对不起。这与您遇到的问题或问题不同。创建一个差异问题。您当前的代码有 moxios 但在模拟和使用 React.useState 时似乎存在其他错误,这是不正确的。您可以从我上面发布的内容开始,然后从那里尝试。
猜你喜欢
  • 2020-05-31
  • 2018-09-24
  • 1970-01-01
  • 2021-10-25
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
相关资源
最近更新 更多