反应测试库和 MSW

发布于 2025-01-16 21:04:03 字数 1918 浏览 4 评论 0原文

我一直在尝试对我的项目实施一些测试,但遇到了一些阻碍。

此错误:

无法找到带有文本的元素:C-3PO/i。这可能是因为文本被多个元素分解。在这种情况下,您可以为文本匹配器提供一个函数,以使您的匹配器更加灵活。

我不知道如何解决它。我应该使用另一个查询还是我遗漏了一些东西?

import { render, screen } from "@testing-library/react";
import CharacterList from "./index";
import { rest } from "msw";
import { setupServer } from "msw/node";

const server = setupServer(
  rest.get("https://swapi.dev/api/people/", (req, res, ctx) => {
    return res(
      ctx.json({ results: [{ name: "Luke Skywalker", gender: "male" }] })
    );
  })
);
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

describe("render characters", () => {
  it("should render character C-3PO when get api response", async () => {
    render(<CharacterList />);
    const character = await screen.findByText("C-3PO/i");
    expect(character).toBeInTheDocument();
  });
});

和我的组件:

import { NavLink } from "react-router-dom";
import { useEffect, useState } from "react";

export default function CharactersList() {
  const [data, setData] = useState(undefined);
  const [home, setHome] = useState(undefined);

  useEffect(() => {
    fetch("https://swapi.dev/api/people/")
      .then((response) => {
        if (response) {
          return response.json();
        } else {
          return Promise.reject(response);
        }
      })
      .then((data) => {
        setData(data);
      });
  }, []);

  if (data) {
    return data.results.map((item) => {
      const id = item.url.slice(29);

      return (
        <>
          <NavLink to={`/character/${id}`}>{item.name}</NavLink>
          <p>Gender: {item.gender}</p>
          <p>Home planet: {item.homeworld}</p>
        </>
      );
    });
  } else {
    return <p>Loading...</p>;
  }
}

I have been trying to implement some tests on my project, but I got some blockers.

This error:

Unable to find an element with the text: C-3PO/i. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

I don't know how to fix it. Should I use another query or I am missing something?

import { render, screen } from "@testing-library/react";
import CharacterList from "./index";
import { rest } from "msw";
import { setupServer } from "msw/node";

const server = setupServer(
  rest.get("https://swapi.dev/api/people/", (req, res, ctx) => {
    return res(
      ctx.json({ results: [{ name: "Luke Skywalker", gender: "male" }] })
    );
  })
);
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

describe("render characters", () => {
  it("should render character C-3PO when get api response", async () => {
    render(<CharacterList />);
    const character = await screen.findByText("C-3PO/i");
    expect(character).toBeInTheDocument();
  });
});

and my component:

import { NavLink } from "react-router-dom";
import { useEffect, useState } from "react";

export default function CharactersList() {
  const [data, setData] = useState(undefined);
  const [home, setHome] = useState(undefined);

  useEffect(() => {
    fetch("https://swapi.dev/api/people/")
      .then((response) => {
        if (response) {
          return response.json();
        } else {
          return Promise.reject(response);
        }
      })
      .then((data) => {
        setData(data);
      });
  }, []);

  if (data) {
    return data.results.map((item) => {
      const id = item.url.slice(29);

      return (
        <>
          <NavLink to={`/character/${id}`}>{item.name}</NavLink>
          <p>Gender: {item.gender}</p>
          <p>Home planet: {item.homeworld}</p>
        </>
      );
    });
  } else {
    return <p>Loading...</p>;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情徒 2025-01-23 21:04:03

请添加 screen.debug() 以查看您的实际屏幕,从中您可以考虑哪种 get 方法适合您。

我认为问题是 DOM 中没有 C-3PO/i 文本

 describe("render characters", () => {
  it("should render character C-3PO when get api response", async () => {
    render(<CharacterList />);
    screen.debug(); <------- ADD THIS
    const character = await screen.findByText("C-3PO/i");
    expect(character).toBeInTheDocument();
  });
});

Please Add screen.debug() to see your actual screen, from that you can consider which get method will work to you.

I think the problem is you don't have C-3PO/i text in the DOM

 describe("render characters", () => {
  it("should render character C-3PO when get api response", async () => {
    render(<CharacterList />);
    screen.debug(); <------- ADD THIS
    const character = await screen.findByText("C-3PO/i");
    expect(character).toBeInTheDocument();
  });
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文