React 测试库:测试元素是否已映射/渲染

2023-12-02

Issue:

我有一个项目列表,我想按每个项目进行测试name值(字符串)。我在用着@testing-library/react并使测试套件正常工作,但我无法让我的测试工作。

概述:

  • Each item测试 ID 为data-testid="side-menu-link"。这必须是唯一的还是可以按原样进行测试?
  • menuItems 由如下字符串组成Dashboard, Settings, and User Preferences

DisplayItems.test.tsx:

// Imports: Dependencies
import React from 'react';
import { render, screen } from '@testing-library/react';

// Imports: App
import App from '../../App';

// Side Menu: Dashboard
test('Renders Dashboard correctly', () => {
  // Render: App
  const { getByTestId } = render(<App />);

  // Expect
  expect(getByTestId('side-menu-link')).toHaveAttribute('Dashboard')
});


// Side Menu: User Preferences
test('Renders Dashboard correctly', () => {
  // Render: App
  const { getByTestId } = render(<App />);

  // Expect
  expect(getByTestId('side-menu-link')).toHaveAttribute('User Preferences')
});

地图项目:

// Map Menu Items
return menuItems.map((menuItem, i) => {
  return (
    <Link data-testid="side-menu-link" key={i} href="#" className="side-menu-link" to={`/${menuItem.itemName}`}>
      <div className={props.currenttab === `${menuItem.itemName}` ? 'side-menu-item-container-selected-light' : 'side-menu-item-container-light'}>
        {menuItem.itemIcon}
        <p className={props.currenttab === `${menuItem.itemName}` ? 'side-menu-title-selected-light' : 'side-menu-title-light'}>{menuItem.itemName}</p>
      </div>
    </Link>
  );
});

你可以有多个testIDs。不然就不会有__AllByTestId选择器。这个名字似乎没有经过深思熟虑,因为它与 HTML id 相似,而 HTML id 必须是唯一的。

如果您使用,则会发生抛出__ByTestId但您有多个具有匹配测试 id 的元素:

it("getByTestId will throw with multiple testIDs", () => {
  const {getAllByTestId, getByTestId} = render(
    <View>
      <Text testID="foo">a</Text>
      <Text testID="foo">b</Text>
    </View>
  );
  expect(getAllByTestId("foo")).toHaveLength(2); // OK
  getByTestId("foo"); // => Error: Found multiple elements with testID: foo
});

要测试地图,您可以向子级添加测试 ID 并使用上述模式。

反应本机:

import "@testing-library/jest-native/extend-expect";

// ...

it("should find text content in all children", () => {
  const {getAllByTestId} = render(
    <View>
      {[..."abcd"].map((e, i) => 
        <View key={e + i} testID="foo"><Text>{e}</Text></View>
      )}
    </View>
  );

  expect(getAllByTestId("foo")).toHaveLength(4);
  
  [..."abcd"].forEach((e, i) => {
    expect(getAllByTestId("foo")[i]).toHaveTextContent(e);
  });
});

React:

it("should find text content in all children", () => {
  const {getAllByTestId} = render(
    <ul>
      {[..."abcd"].map((e, i) => 
        <li key={e + i} data-testid="foo">{e}</li>
      )}
    </ul>
  );

  expect(getAllByTestId("foo")).toHaveLength(4);

  [..."abcd"].forEach((e, i) => {
    expect(getAllByTestId("foo")[i].textContent).toEqual(e);
  });

  // or:
  //const contents = getAllByTestId("foo").map(e => e.textContent);
  //expect(contents).toEqual([..."abcd"]);
});

还可以添加一个testID到映射列表元素的父级,选择父级,然后遍历其.children数组对每个子树进行断言。

注意之间的差异testID在注册护士和data-testid在反应中。


顺便说一句,我不确定

expect(getByTestId('side-menu-link')).toHaveAttribute('User Preferences')

这里很有意义。属性是<div this_is_an_attribute="foo">-- 您可能正在寻找文本内容。


使用的包,供参考:

反应本机

{
  "dependencies": {
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-native": "^0.64.0",
    "react-native-web": "^0.15.6"
  },
  "devDependencies": {
    "@babel/core": "^7.13.15",
    "@testing-library/jest-native": "^4.0.1",
    "@testing-library/react-native": "^7.2.0",
    "babel-jest": "^26.6.3",
    "jest": "^26.6.3",
    "metro-react-native-babel-preset": "^0.65.2",
    "react-test-renderer": "^17.0.2"
  }
}

React

{
  "dependencies": {
    "@babel/runtime": "7.10.5",
    "react": "16.13.1",
    "react-dom": "16.13.1",
  },
  "devDependencies": {
    "@babel/core": "7.10.5",
    "@babel/plugin-proposal-class-properties": "7.10.4",
    "@babel/preset-env": "7.10.4",
    "@babel/preset-react": "7.10.4",
    "@testing-library/dom": "7.21.0",
    "@testing-library/jest-dom": "^5.11.1",
    "@testing-library/react": "10.4.7",
    "@testing-library/react-hooks": "3.3.0",
    "@testing-library/user-event": "12.0.11",
    "babel-jest": "26.1.0",
    "jest": "26.1.0",
    "jest-environment-jsdom": "26.1.0",
    "react-test-renderer": "16.13.1",
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 测试库:测试元素是否已映射/渲染 的相关文章

随机推荐

  • 如何替换除西​​班牙语之外的所有 unicode 字符?

    我正在尝试从文件中删除除西班牙语字符之外的所有 Unicode 字符 匹配不同的元音没有任何问题 不会使用以下正则表达式进行替换 但所有其他 Unicode 似乎都会被替换 perl pe s ascii g filename 但是 当我将
  • 有没有办法隐藏/停止调试生成的一些输出

    寻求帮助以了解为什么我从下面的调试行获得额外的输出 name Check kernel diff become true shell sdiff item pre kernel out item post kernel out grep a
  • 函数将自身嵌套在原型中

    问题1 我在 JS 中尝试对象和构造函数的原型时 我注意到 function f a this a a this x 1 function f2 a this a a this x 4 f2 proto f 9 var of2 new f2
  • 在 pandas DataFrame 中有效地查找匹配行(基于内容)

    我正在编写一些测试 并使用 Pandas DataFrames 来容纳大型数据集 600 000 x 10 我已经从源数据中提取了 10 个随机行 使用 Stata 现在我想编写一个测试 看看这些行是否在我的测试套件的 DataFrame
  • 更新同一页面内的 php 变量而无需重新加载页面

    我对 AJAX 不太了解 但我很确定它可以解决我的问题 我想更新 php 变量 th 单击 然后 该变量将用于使用 Jquery 表排序脚本对我的某些列进行排序 在页面顶部 bodyshops php 我有这个 if isset GET s
  • 将 PHP 代码插入 Visual Composer

    我有 php 代码 ACF Pro 插件代码 如何将此代码插入到我的 Visual Composer 中 很长时间找不到解决方案 但现在对我来说至关重要
  • 在 HTML 标记中使用 System.Drawing.Image

    我有一个可能很简单的问题 我将图像存储在数据库中 然后在应用程序中使用 C 方法来获取该图像并将其存储在自定义类中 如下所示 public class MyImage public System Drawing Image myImageF
  • 如何通过在 Windows 中从源代码构建 gvim/vim 来添加“-with-python”选项

    我已经尝试在 Windows 中从源代码构建 vim gvim 好几天了 而且 这座建筑实际上是通过两种方式运作的CygWin and WinGW 然而 python没有在我的 g vim exe 中 添加 它禁用了pyflakes vim
  • 会话 ID 太长或包含非法字符,有效字符为 a-z、A-Z、0-9 和 '-,'

    怎么解决 警告 session start function session start 会话 ID 太长或包含非法字符 有效字符为 a z A Z 0 9 和 in 第 3 行 警告 session start function sess
  • 使用 numpy 从 csv 加载一定数量的行

    我有一个很长的文件 我只需要其中的一部分 一部分 有新数据传入 因此文件可能会变长 从我使用的 CSV 加载数据numpy genfromtxt np genfromtxt filename usecols col delimiter sk
  • 如何在 Mongoose 中将 _id 设置为数据库文档?

    我试图通过计算数据库中的文档数来动态创建 Mongoose 模型的 id 并使用该数字创建 id 假设第一个 id 为 0 但是 我无法从我的值中设置 id 这是我的代码 Schemas var Post new mongoose Sche
  • Jetpack Compose 中的 super.onbackpressed()

    I need to click on the image to go to the last activity 调用标准方法时出错 这是最简单的方法 但是not一个安全并且应该not是推荐的一个 因为我们不知道这里可能有什么上下文 但如果它
  • CSS:绝对位置调整大小失败

    所以 我有这张带有 CSS 样式的图像 city1 position absolute float left top 34px left 170px a href malmo img class city1 src images city
  • 如何使用可选的格式化消息实现符合标准的断言宏?

    使用可选格式化消息实现符合标准的断言宏的方法是什么 我所拥有的在 clang 中工作 但是 正确地 触发了 Wgnu zero variadic macro arguments如果打开则发出警告 例如通过 Wpedantic 当使用宏而没有
  • 绕轴旋转画布问题

    我正在使用 canvas 3d 绘制 3d 图形 在其中我可以绘制 1 5 4 8 6 2 等点 所以我能够绘制所有正和负 x y 和 z 轴 我还通过使用箭头键实现了旋转效果 旋转说明 z 轴从屏幕中心延伸出来 要绕 x 轴旋转 请按向上
  • 如何快速从一百万条数据记录中获取最近的100个点?

    给定一个点A 从一百万条数据记录中获取最接近的100个点 数据库是MySql 百万条经纬度记录 这些点表示用户登录时的当前位置 因此它们可能会发生变化 设想 当用户打开页面时 显示最近的前 100 个其他人 如果您还没有这样做 请为您的数据
  • Java:使用 TCP 套接字的简单 http GET 请求

    我在本地托管一个简单的 PHP 回显服务器 我试图用 Java 向服务器发送消息 并使用 GET 请求打印响应 但收到 格式错误的 HTTP 请求 错误 谁能告诉我如何正确格式化 GET 请求 客户端代码 import java io im
  • 了解有关内联水平框高度的 CSS2.1 规范

    CSS2 1 第 10 6 1 节指定 内容区域的高度应该根据字体而定 但这规范没有具体说明如何 例如 UA 可以使用 em box 或字体的最大上升部分和下降部分 内联非替换框的垂直内边距 边框和边距从内容区域的顶部和底部开始 并且与以下
  • word中删除contentControl后出现空行

    我正在尝试通过以下方式写入Word文档VB net为此我正在使用内容控件在我的Word文档中 但有时我必须删除内容控制或者通过 VB 代码实现另一个 这很容易contentcontrol delete但是当这个 contentControl
  • React 测试库:测试元素是否已映射/渲染

    Issue 我有一个项目列表 我想按每个项目进行测试name值 字符串 我在用着 testing library react并使测试套件正常工作 但我无法让我的测试工作 概述 Each item测试 ID 为data testid side