我正在try 使用模拟axios测试下面的组件,但是,组件似乎没有按预期渲染,有人能帮我吗?我被困了好一阵子了.组件每1秒获取一个api.

const RealtimePrice = () => {
  var [cryptoFeed, setCryptoFeed] = useState<cryptoFeed>([]);
  var [currency, setCurrency] = useState(currencyList[0]);
  var [cryptoSearch, setCryptoSearch] = useState("");

  const url = `https://api.coingecko.com/api/v3/coins/markets?ids=${ids}&vs_currency=${currency}`;
  const intervalRef = useRef<NodeJS.Timer>();

  const onCurrencyChangeHandler = useCallback((newValue: string) => {
    setCurrency(newValue);
  }, []);

  const onCryptoSearchChangeHandler = useCallback((newValue: string) => {
    setCryptoSearch(newValue);
  }, []);

  useEffect(() => {
    const getCryptoFeed = () => {
      axios.get(url).then((response: any) => {
        if (response.data) {
          console.debug("The state is set");
          setCryptoFeed(response.data);
        } else {
          console.debug("The state is not set");
          setCryptoFeed([]);
        }
      });
    };

    getCryptoFeed();
    intervalRef.current = setInterval(getCryptoFeed, 1000);
    return () => {
      clearInterval(intervalRef.current);
    };
  }, [url]);

  const priceBlocks = cryptoFeed
    .filter((crypto) =>
      crypto.name.toLowerCase().includes(cryptoSearch.toLowerCase())
    )
    .map((crypto: any) => {
      return (
        <PriceBlock
          key={crypto.id}
          id={crypto.id}
          name={crypto.name}
          price={crypto.current_price}
          volume={crypto.total_volume}
          change={crypto.price_change_24h}
        ></PriceBlock>
      );
    });

  return (
    <div className={styles.container}>
      <div className={styles["header-section"]}>
        <h1>Cryptocurrency Realtime Price</h1>
        <div className="input-group">
          <Selectbox
            onChange={onCurrencyChangeHandler}
            defaultOption={currencyList[0]}
            options={currencyList}
          />
          <Inputbox
            placeHolder="Enter crypto name"
            onChange={onCryptoSearchChangeHandler}
          />
        </div>
      </div>
      <div className={styles.priceblocks}>{priceBlocks}</div>
    </div>
  );
};

测试定义如下,findByText给出错误,它找不到元素.

import { render, screen } from "@testing-library/react";
import RealtimePrice from "../RealtimePrice";

describe("Realtime Price", () => {
  it("should render the Bitcoin price block", async () => {
    render(<RealtimePrice />);
    const pb = await screen.findByText("Bitcoin");
    expect(pb).toBeInTheDocument();
  });
});

包装中.json我已设置

  "jest": {
    "collectCoverageFrom": [
      "src/**/*.{js,jsx,ts,tsx}"
    ],
    "resetMocks": false
  }

在src/mocks/axios中.js公司

const mockGetResponse = [
  {
    id: "bitcoin",
    name: "Bitcoin",
    price: 20000,
    volume: 12004041094,
    change: -12241,
  },
  {
    id: "solana",
    name: "Solana",
    price: 87,
    volume: 200876648,
    change: 122,
  },
];

const mockResponse = {
  get: jest.fn().mockResolvedValue(mockGetResponse),
};

export default mockResponse;

enter image description here

enter image description here

推荐答案

我们的 comments 似乎很清楚,问题是mock没有返回正确的响应.数据(这就是为什么u将空数组设置为状态)

try 执行以下操作:

const mockResponse = {
  get: jest.fn().mockResolvedValue({data: mockGetResponse}),
};

Reactjs相关问答推荐

我想将状态设置为true,直到每一张卡片都生成并在多姆中呈现

在迁移到Redux—Toolkit 2.0和Redux5.0之后,我在extraReducer和Slice方面有点挣扎,

react 路由GUGUD Use Effect无法通过useNavigate正常工作

TanStack/Reaction-Query在我的Vercel应用程序中不起作用

在构建或部署Reaction应用程序时出错

useEffect firebase 清理功能如何工作?

React Todo List 应用程序我在实现删除功能时遇到问题

react 本机屏幕转换

useRef.current.value 为空值

BrowserRouter改变了URL但没有链接到页面

将外部 JavaScript 导入 React(通过文件)

我应该如何将字符串作为props 传递给 React 组件?

Next.js i18n 路由不适用于动态路由

来自一个自定义 React Native 组件的样式从另一个自定义组件移除样式

意外的标记.您可能需要一个合适的加载器来处理这种文件类型.书?.img? /*#__PURE__*/React.createElement("img",

错误:无效挂钩调用.钩子只能在函数组件的主体内部调用.使用 next/router 时

如何根据数据库中的值设置单选按钮选中? - react

为什么重新渲染不会影响 setTimeout 的计数?

在react 钩子中将数组添加到数组状态给出一个数字

a.active 类在导入 x.scss 文件时有效,但在使用 x.module.scss 时无效