Skip to content

Conversation

@zombieJ
Copy link
Member

@zombieJ zombieJ commented Mar 7, 2025

Summary by CodeRabbit

  • Chores
    • 移除了过时的开发依赖,简化了项目依赖管理。
  • Tests
    • 将测试套件从旧的测试库迁移到现代测试库,提升了组件渲染、事件模拟与断言的准确性与可维护性。

@vercel
Copy link

vercel bot commented Mar 7, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
table ✅ Ready (Inspect) Visit Preview 💬 Add feedback Mar 7, 2025 8:47am

@coderabbitai
Copy link

coderabbitai bot commented Mar 7, 2025

Walkthrough

本次 PR 移除 package.json 中与 Enzyme 相关的开发依赖,并对多个测试文件进行了重构。所有测试文件均将 Enzyme 的 mountfindsimulate 方法替换为 React Testing Library 的 renderquerySelectorfireEvent 方法,同时更新了断言逻辑和部分函数签名,确保测试行为更符合用户交互模式。

Changes

文件 更改说明
package.json 删除了 devDependencies 中的 @types/enzymeenzymeenzyme-adapter-react-16enzyme-to-json 依赖。
tests/(Cell.spec.tsx, Colgroup.spec.jsx, Deprecated.spec.jsx, ExpandRow.spec.jsx, FixedColumn-IE.spec.jsx, FixedColumn.spec.tsx, FixedHeader.spec.jsx, GroupingColumns.spec.jsx, Hover.spec.tsx, Internal.spec.jsx, Scroll.spec.jsx, Sticky.spec.jsx, Summary.spec.tsx, Table.spec.jsx, classComponent.spec.tsx) 将 Enzyme 的 mountfindsimulate 等方法替换为 React Testing Library 的 renderquerySelectorfireEvent 方法,更新了事件模拟、断言逻辑和组件重新渲染的处理方式。
tests/setup.ts 删除了 Enzyme 及其适配器的配置,只保留了其他测试环境的设置。
tests/utils.js 简化了 safeAct 函数的接口和内部逻辑,并更新了导入,切换至 @testing-library/react

Possibly related PRs

Suggested reviewers

  • MadCcc

Poem

小兔子跳过代码山,
轻松剔除旧酶烦,
渲染测试换新装,
火花飞舞映屏端,
快乐步伐迎晨曦 🌸
代码轻盈心更宽。
祝改动顺利乐无边!

Warning

There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

tests/FixedColumn.spec.tsx

Oops! Something went wrong! :(

ESLint: 8.57.1

ESLint couldn't find the config "prettier" to extend from. Please check that the name of the config is correct.

The config "prettier" was referenced from the config file in "/.eslintrc.js".

If you still have problems, please stop by https://eslint.org/chat/help to chat with the team.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 408ef73 and 786f25e.

📒 Files selected for processing (1)
  • tests/FixedColumn.spec.tsx (7 hunks)
🧰 Additional context used
🪛 GitHub Check: codecov/patch
tests/FixedColumn.spec.tsx

[warning] 88-89: tests/FixedColumn.spec.tsx#L88-L89
Added lines #L88 - L89 were not covered by tests

🔇 Additional comments (7)
tests/FixedColumn.spec.tsx (7)

8-13: 异步 triggerResize 函数实现正确

triggerResize 函数现在被正确地实现为异步函数,并且正确地使用 act 包装了状态更新和 Promise 解析。这种实现方式符合 React Testing Library 的最佳实践。


88-89: 需要使用类型断言并确保测试覆盖

代码中使用了类型断言 as HTMLElement,这是正确的做法,但该段代码未被测试覆盖。

#!/bin/bash
# 检查是否有其他地方使用了类似的断言模式
rg "as HTMLElement" --type ts
🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 88-89: tests/FixedColumn.spec.tsx#L88-L89
Added lines #L88 - L89 were not covered by tests


2-3: React Testing Library 导入正确

正确导入了 React Testing Library 的 renderfireEventact 方法,以及 resize-observer 的 _rs 函数,这些都是从 Enzyme 迁移所必需的。


81-83: 从 Enzyme 迁移到 React Testing Library 的渲染方法

正确地将 Enzyme 的 mount 替换为 React Testing Library 的 render 方法,并使用 container.querySelector 来获取 DOM 元素。


92-95: 异步测试处理良好

使用 act 包装 runAllTimersPromise.resolve() 可以确保所有异步操作都被正确处理,这是处理计时器和 Promise 的最佳实践。


134-142: 正确使用 fireEvent 模拟 DOM 事件

将 Enzyme 的 simulate 方法替换为 React Testing Library 的 fireEvent 方法来触发 DOM 事件,并正确设置了元素属性。


143-148: 断言方式更新

断言已从 Enzyme 的包装器方法更新为直接检查 DOM 元素的类名,这更符合 React Testing Library 的理念,即测试应该反映用户的实际交互方式。

✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (4)
tests/classComponent.spec.tsx (1)

6-8: 类组件测试恢复和类型定义改进

测试不再被跳过(从xit改为it),并且添加了正确的 TypeScript 类型定义 <{}, { count: number }>

针对静态分析工具的建议,可以更好地定义空 props 类型:

-class Demo extends React.Component<{}, { count: number }> {
+class Demo extends React.Component<Record<string, never>, { count: number }> {

或者如果这个组件需要支持子组件,可以使用:

-class Demo extends React.Component<{}, { count: number }> {
+class Demo extends React.Component<React.PropsWithChildren<Record<string, never>>, { count: number }> {
🧰 Tools
🪛 Biome (1.9.4)

[error] 7-7: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

tests/Summary.spec.tsx (1)

58-84: 摘要行点击事件测试需改进

摘要行点击事件测试已迁移,但空值检查可以改进。

建议使用断言替代条件判断,这样当元素不存在时测试会更明确地失败:

-    const tr = container.querySelector('tfoot tr');
-    if (tr) {
-      fireEvent.click(tr);
-    }
+    const tr = container.querySelector('tfoot tr');
+    expect(tr).toBeTruthy();
+    fireEvent.click(tr!);
tests/ExpandRow.spec.jsx (1)

136-140: 使用可选链优化代码

此代码段可以使用可选链运算符来简化条件检查。

-  const resizeObserver = container.querySelector('ResizeObserver');
-  if (resizeObserver && resizeObserver.onResize) {
-    resizeObserver.onResize({ width: 1128 });
-  }
+  const resizeObserver = container.querySelector('ResizeObserver');
+  resizeObserver?.onResize?.({ width: 1128 });
🧰 Tools
🪛 Biome (1.9.4)

[error] 137-138: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

tests/FixedColumn.spec.tsx (1)

134-148: 使用可选链进行安全访问

tableContent 进行了适当的空检查,但可以使用可选链运算符使代码更简洁。

act(() => {
-  if (tableContent) {
-    Object.defineProperty(tableContent, 'scrollLeft', { value: 10, writable: true });
-    Object.defineProperty(tableContent, 'scrollWidth', { value: 200, writable: true });
-    Object.defineProperty(tableContent, 'clientWidth', { value: 100, writable: true });
-    fireEvent.scroll(tableContent);
-  }
+  if (!tableContent) return;
+  
+  Object.defineProperty(tableContent, 'scrollLeft', { value: 10, writable: true });
+  Object.defineProperty(tableContent, 'scrollWidth', { value: 200, writable: true });
+  Object.defineProperty(tableContent, 'clientWidth', { value: 100, writable: true });
+  fireEvent.scroll(tableContent);
});
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7c11736 and 94f2148.

⛔ Files ignored due to path filters (4)
  • tests/__snapshots__/ExpandRow.spec.jsx.snap is excluded by !**/*.snap
  • tests/__snapshots__/FixedColumn.spec.tsx.snap is excluded by !**/*.snap
  • tests/__snapshots__/Summary.spec.tsx.snap is excluded by !**/*.snap
  • tests/__snapshots__/Table.spec.jsx.snap is excluded by !**/*.snap
📒 Files selected for processing (18)
  • package.json (0 hunks)
  • tests/Cell.spec.tsx (6 hunks)
  • tests/Colgroup.spec.jsx (4 hunks)
  • tests/Deprecated.spec.jsx (3 hunks)
  • tests/ExpandRow.spec.jsx (33 hunks)
  • tests/FixedColumn-IE.spec.jsx (2 hunks)
  • tests/FixedColumn.spec.tsx (7 hunks)
  • tests/FixedHeader.spec.jsx (6 hunks)
  • tests/GroupingColumns.spec.jsx (6 hunks)
  • tests/Hover.spec.tsx (9 hunks)
  • tests/Internal.spec.jsx (2 hunks)
  • tests/Scroll.spec.jsx (6 hunks)
  • tests/Sticky.spec.jsx (9 hunks)
  • tests/Summary.spec.tsx (6 hunks)
  • tests/Table.spec.jsx (41 hunks)
  • tests/classComponent.spec.tsx (2 hunks)
  • tests/setup.ts (0 hunks)
  • tests/utils.js (1 hunks)
💤 Files with no reviewable changes (2)
  • tests/setup.ts
  • package.json
🧰 Additional context used
🪛 Biome (1.9.4)
tests/classComponent.spec.tsx

[error] 7-7: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)

tests/ExpandRow.spec.jsx

[error] 137-138: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

🪛 GitHub Actions: ✅ test
tests/FixedColumn.spec.tsx

[error] 268-268: error TS2345: Argument of type 'Element' is not assignable to parameter of type 'HTMLElement'. Type 'Element' is missing the following properties from type 'HTMLElement': accessKey, accessKeyLabel, autocapitalize, dir, and 126 more.

🔇 Additional comments (183)
tests/utils.js (1)

1-8: 函数简化并从 Enzyme 迁移到 React Testing Library!

这个改动符合 PR 的目标,即将测试从 Enzyme 迁移到 React Testing Library。safeAct 函数已经简化,移除了 wrappercb 参数,这符合 React Testing Library 的测试方法,它更关注用户交互而非组件内部。

需要注意的是,由于函数签名发生了变化,调用此函数的其他代码也需要相应更新。

tests/FixedColumn-IE.spec.jsx (4)

2-7: 正确导入 React Testing Library 的功能

从 Enzyme 的 mount 切换到 React Testing Library 的 renderact,同时保留了必要的测试工具导入。


45-45: 成功从 Enzyme 迁移到 React Testing Library

使用 render 替代 mount 并解构出 container,这符合 React Testing Library 的使用模式。


47-51: 中文注释增加了代码可读性

添加了解释性的中文注释,说明了这段代码的目的,有助于其他开发者理解测试逻辑。


53-54: 测试断言正确更新

从 Enzyme 的 wrapper.exists 变更为 React Testing Library 的 container.querySelector 并将断言从 toBeFalsy() 更改为检查 null,这符合 React Testing Library 的测试方法。

tests/Internal.spec.jsx (2)

1-1: 正确导入 React Testing Library

从 Enzyme 切换到了 React Testing Library,导入了需要的 render 方法。


9-20: 成功从 Enzyme 的 mount 迁移到 React Testing Library 的 render

使用 render 替代 mount 并解构出 container,这符合 React Testing Library 的使用模式。

tests/Deprecated.spec.jsx (3)

2-3: 正确更新导入

从 Enzyme 切换到了 React Testing Library,同时更新了 resetWarned 的导入路径。


27-27: 成功从 Enzyme 迁移到 React Testing Library

使用 render 替代 mount,这符合 PR 的迁移目标。


39-41: 成功迁移测试断言

使用 React Testing Library 的 render 替代 Enzyme 的 mount,保持了原有的断言逻辑,确保警告信息包含已移除的属性名。

tests/Hover.spec.tsx (11)

1-1: 正确引入了 React Testing Library

从 Enzyme 切换到 React Testing Library,使用了正确的导入语句。


20-23: 成功使用了 React Testing Library 替换 Enzyme

恰当地使用了 render 函数替代 mount,并使用 container.querySelectorAllfireEvent.mouseEnter 替代了 Enzyme 的 findsimulate 方法。断言也正确地更新为使用 container.querySelector


25-26: mouseLeave 事件模拟实现正确

使用 fireEvent.mouseLeave 替代 Enzyme 的 simulate('mouseLeave') 方法,保持了测试逻辑的一致性。


30-39: shouldCellUpdate 测试顺利迁移

成功将测试用例从 Enzyme 迁移到 React Testing Library,同时保持了测试的原始意图和逻辑。


40-41: 鼠标离开事件测试正确实现

测试逻辑清晰,使用 fireEvent.mouseLeave 和恰当的断言验证功能。


48-71: 警告测试迁移完成

成功迁移了关于行合并的警告测试,从 Enzyme 到 React Testing Library 的转换保留了测试的原始意图。


72-87: 合并单元格测试正确实现

正确实现了合并单元格的测试,使用了 React Testing Library 的查询方法和事件触发函数,逻辑清晰。


94-129: onCell 测试迁移完成

成功将 onCell 功能测试从 Enzyme 迁移到 React Testing Library,同时保持了测试的一致性和有效性。


131-170: legacy 模式性能测试迁移完成

成功迁移了性能测试,确保在每次鼠标事件发生时都会触发渲染。测试逻辑没有变化,只是更新了测试库的调用方式。


172-208: 性能模式测试迁移完成

成功迁移了性能模式测试,验证了优化后的渲染行为。测试逻辑保持不变,只是改变了测试库的使用方式。


211-243: 组件渲染测试迁移完成

成功迁移了自定义渲染组件的测试,确保渲染次数符合预期。测试逻辑保持不变,只是更新了测试库的使用方式。

tests/classComponent.spec.tsx (3)

2-2: 正确引入了 React Testing Library

从 Enzyme 切换到 React Testing Library,使用了正确的导入语句。


32-36: 成功使用 React Testing Library 方法

恰当地使用了 render 函数和 getByRole 方法来查找按钮,同时使用了 textContent 属性验证内容。


37-40: 点击事件和状态更新测试实现正确

使用 fireEvent.click 替代 Enzyme 的 simulate('click') 方法,并正确验证了状态更新。

tests/GroupingColumns.spec.jsx (5)

1-1: 正确引入了 React Testing Library

从 Enzyme 切换到 React Testing Library,使用了正确的导入语句,包括 actfireEvent


59-81: 表格分组列测试迁移完成

成功迁移了分组列测试,恰当地使用了 container.querySelector 替代 Enzyme 的 find 方法,并使用 getAttribute 获取属性值。


123-126: issues/4061 测试用例迁移完成

正确迁移了针对 GitHub issue #4061 的测试用例,确保了行合并功能的正确性。


154-157: 奇怪布局测试迁移完成

成功迁移了特殊布局测试,并正确验证了 rowspan 属性值。


186-194: 隐藏列测试迁移完成

成功迁移了隐藏列测试,使用了 container.querySelectorAll 和链式查询正确地获取和验证元素内容。

tests/Summary.spec.tsx (8)

1-1: 正确引入了 React Testing Library

从 Enzyme 切换到 React Testing Library,使用了正确的导入语句。


17-28: 表格摘要行测试迁移完成

成功迁移了表格摘要行渲染测试,使用了 container.querySelector 替代 Enzyme 的 find 方法,并正确使用可选链操作符检查元素存在性。


31-54: 数据类型支持测试迁移完成

成功迁移了数据类型支持测试,保持了快照测试逻辑。


89-109: 固定摘要表格函数迁移完成

成功迁移了获取固定摘要表格的函数,使用了 React Testing Library 的 render 方法。


111-114: 固定摘要测试迁移完成

成功迁移了固定摘要测试,使用了 container.querySelector 替代 Enzyme 的 find 方法。


117-120: 底部固定摘要测试迁移完成

成功迁移了底部固定摘要测试,测试逻辑保持一致。


123-126: 粘性摘要测试迁移完成

成功迁移了粘性摘要测试,验证了正确的 CSS 类。


129-131: 顶部固定摘要测试迁移完成

成功迁移了顶部固定摘要测试,使用了复合选择器正确地查找元素。

tests/Sticky.spec.jsx (23)

1-1: 导入React Testing Library的相关函数

代码从Enzyme测试库转换为React Testing Library,这里导入了必要的renderfireEventcreateEvent函数,这些都是React Testing Library的核心API。


4-4: 直接导入React Testing Library的act函数

从React Testing Library直接导入act函数,替代了之前从自定义utils导入的safeAct。这是一个很好的简化,减少了额外的抽象层。


32-36: 使用React Testing Library的render方法和查询DOM

将Enzyme的mount替换为React Testing Library的render方法,并使用解构获取containerrerender。这符合React Testing Library的最佳实践,更关注用户实际交互的方式。


34-42: 更新DOM查询和样式断言

使用container.querySelectorAll替代了Enzyme的find方法,并直接检查DOM元素的style属性。这种方式更接近实际用户体验,使测试更可靠。


44-47: 使用React Testing Library的act函数

使用React Testing Library的act函数包装异步操作,确保组件更新完全应用后再进行断言,这是处理副作用的正确方式。


48-55: 更新DOM元素查询和样式断言

代码继续使用container.querySelectorAll查询更新后的DOM元素,并检查它们的样式。这种方法更符合实际用户交互模式。


87-121: 使用React Testing Library渲染表格

将Enzyme的mount替换为React Testing Library的render方法,这种转换保持了测试的功能,同时使测试更加符合实际用户交互方式。


128-128: 使用container查询DOM元素

使用container.querySelector替代Enzyme的find方法来查找DOM元素,这使得测试更加直观和可靠。


141-141: 使用container查询DOM元素进行断言

继续使用container.querySelector查找DOM元素并进行存在性检查,符合React Testing Library的测试风格。


151-159: 使用createEvent和fireEvent模拟鼠标事件

使用React Testing Library的createEventfireEvent函数替代Enzyme的事件模拟,这更接近真实的用户交互方式。


170-175: 更新样式断言使用新的方法

代码使用expect.objectContaining方法检查样式对象,这更灵活且可读性更好。


184-189: 使用一致的样式断言方法

继续使用expect.objectContaining检查样式对象,保持了测试风格的一致性。


198-198: 检查元素类名存在性

使用container.querySelector替代Enzyme的选择器方法,简化了测试代码。


236-249: 使用React Testing Library的render方法

将Enzyme的mount替换为React Testing Library的render方法,保持测试的一致性。


243-248: 更新样式断言使用新的方法

继续使用expect.objectContaining检查样式属性,使断言更清晰和灵活。


283-286: 继续使用React Testing Library的render方法

保持使用render方法和await act组合来处理异步更新,确保测试的可靠性。


287-295: 使用同样的查询和断言模式

保持一致的DOM查询和样式断言模式,使测试代码更易于维护。


304-306: 处理DOM元素创建

使用更现代的方式创建并配置DOM元素,使代码更清晰。


354-394: 使用React Testing Library渲染并查询

将复杂组件的渲染从Enzyme切换到React Testing Library,保持测试逻辑的一致性。


399-400: 直接从容器元素查询DOM

从特定容器元素查询DOM节点,而不是使用Enzyme的包装器,这更接近实际DOM操作。


408-413: 使用React Testing Library的事件相关函数

使用createEvent创建鼠标事件并使用fireEvent触发,替代了Enzyme的事件模拟方法。


414-426: 使用新的事件模拟方式

使用更现代的方式定义和触发鼠标事件,并进行相应的样式断言。


428-428: 使用组件卸载方法

使用React Testing Library的unmount方法替代Enzyme的相应功能,确保测试资源正确释放。

tests/Scroll.spec.jsx (16)

1-1: 导入React Testing Library的相关函数

从React Testing Library导入renderfireEvent函数,替代之前使用的Enzyme函数,这是向更现代测试库迁移的第一步。


4-4: 导入React Testing Library的act函数

直接从React Testing Library导入act函数,用于处理组件渲染后的异步状态更新。


24-24: 使用React Testing Library的render方法

将Enzyme的mount替换为React Testing Library的render方法,并解构出container变量。


26-26: 使用querySelector替代find方法

使用container.querySelector替代Enzyme的find方法来查询DOM元素,这更接近原生DOM API。


30-35: 使用React Testing Library渲染和查询

继续使用render方法和container.querySelector,保持一致的测试风格。


39-42: 样式断言更新

对表格和内容元素的样式直接进行断言,而不是通过Enzyme的props方法。


45-47: 数字样式值断言

使用container.querySelector获取元素并直接断言其样式属性,注意值现在包含单位(如'200px')。


51-55: 处理滚动样式断言

继续使用一致的DOM查询和样式断言模式。


96-105: 使用React Testing Library渲染表格

将复杂表格组件的渲染从Enzyme切换到React Testing Library。


107-109: 使用act包装状态更新

使用act函数包装定时器运行,确保组件状态更新完成后再进行断言。


113-114: 使用container查询DOM元素

使用container.querySelector获取header元素,而不是通过Enzyme的包装器。


128-129: 使用container获取body元素

使用container.querySelector获取表格body元素进行后续操作。


130-139: 使用Object.defineProperty定义属性

直接在DOM元素上使用Object.defineProperty定义scrollLeft、scrollWidth和clientWidth属性,而不是通过Enzyme的模拟。


140-141: 使用fireEvent触发滚动事件

使用React Testing Library的fireEvent.scroll触发scroll事件,替代Enzyme的事件模拟。


143-145: 使用act确保状态更新

将定时器运行包装在act中,确保组件状态更新完成。


164-164: 使用React Testing Library的render方法

继续使用render方法替代Enzyme的mount,保持测试风格一致性。

tests/Table.spec.jsx (77)

1-1: 导入React Testing Library的相关函数

从React Testing Library导入renderfireEvent函数,替代之前使用的Enzyme函数,符合PR的整体目标。


4-4: 导入React Testing Library的act函数

直接从React Testing Library导入act函数,用于处理异步状态更新。


22-28: 使用React Testing Library的render方法

使用render方法替代Enzyme的mount,并解构出container变量用于后续查询。


28-28: 使用container.firstChild进行快照测试

使用container.firstChild替代Enzyme的wrapper.render()进行快照测试。


32-39: 保持一致的测试风格

继续使用相同的模式渲染组件并进行快照测试。


43-44: 无列渲染测试

使用React Testing Library的API测试无列的表格渲染。


48-68: 测试列子元素为undefined的情况

使用React Testing Library渲染并检查DOM元素内容。


72-85: 测试falsy列

继续使用一致的测试模式检查falsy列的渲染。


91-92: 测试ReactNode空文本

使用container.querySelector查找并检查占位符文本。


96-97: 测试renderProps空文本

与上面相同的测试模式,检查函数返回的空文本。


108-110: 测试effect更新

使用React Testing Library的renderrerender方法测试effect更新。


115-116: 测试无表头渲染

使用querySelector检查thead元素是否存在。


120-121: 测试固定表头

检查固定表头元素是否正确渲染。


125-126: 测试标题渲染

检查表格标题元素的内容。


130-131: 测试页脚渲染

检查表格页脚元素的内容。


136-137: 测试ID渲染

使用querySelector检查带有特定ID的div元素是否存在。


142-144: 测试data-属性

检查表格div元素是否具有正确的data-test属性。


149-151: 测试aria-属性

检查表格元素是否具有正确的aria-label属性。


156-159: 测试rowKey使用record.key

检查行元素的data-row-key属性是否正确设置。


163-166: 测试通过rowKey设置key

检查使用name属性作为rowKey时行元素的data-row-key属性。


170-173: 测试通过rowKey函数设置key

检查使用函数返回值作为rowKey时行元素的data-row-key属性。


180-181: 测试字符串标题

检查表格标题元素是否存在。


186-187: 测试React.Node标题

检查嵌套的标题元素是否存在。


192-193: 测试无标题

检查没有标题时标题元素是否不存在。


198-203: 测试tableLayout

检查表格元素的tableLayout样式和类名是否正确设置。


207-217: 测试省略号

检查单元格是否包含正确的省略号类名。


221-231: 测试通过showTitle选项设置省略号

检查使用showTitle选项时单元格是否包含正确的省略号类名。


239-245: 测试不渲染省略号原始html标题

检查表头和表体单元格的title属性是否正确设置。


250-268: 测试列scope正确渲染

检查表头单元格的scope属性是否正确设置。


271-289: 测试行scope正确渲染

检查表体th元素的scope属性是否正确设置。


303-309: 测试列正确渲染

检查单元格的类名、内容和列宽是否正确设置。


320-323: 测试自定义单元格正确渲染

检查自定义渲染的单元格内容是否正确。


338-338: 测试falsy数据索引

使用React Testing Library的render方法而不提取容器,因为这里只需要触发渲染。


352-362: 测试通过路径渲染文本

检查使用嵌套数据路径时单元格内容是否正确。


370-371: 测试空对象文本渲染为空单元格

检查空对象数据时单元格内容是否为空。


413-414: 测试colSpan正确渲染

使用React Testing Library渲染并进行快照测试。


431-435: 测试使用style和className渲染

检查单元格的样式、类名和自定义数据属性是否正确设置。


467-468: 测试rowSpan正确渲染

使用React Testing Library渲染并进行快照测试。


474-474: 测试无rowKey警告

使用React Testing Library渲染组件测试警告。


482-490: 测试字符串rowClassName

检查表体行是否包含正确的类名。


494-502: 测试函数rowClassName

检查使用函数返回类名时表体行是否包含正确的类名。


511-515: 测试onRow正确渲染

检查行元素的ID属性是否正确设置并模拟点击事件。


535-540: 测试onRow保持更新

使用React Testing Library的getByTextfireEvent.click测试状态更新。


549-554: 测试column.onCell正确渲染

检查单元格元素的ID属性是否正确设置。


561-563: 测试onHeaderRow正确渲染

检查表头行元素的ID属性是否正确设置。


575-577: 测试column.onHeaderCell

检查表头单元格元素的ID属性是否正确设置。


603-604: 测试自定义组件

使用React Testing Library渲染自定义组件并进行快照测试。


614-622: 测试固定列和表头

使用React Testing Library渲染带有固定列和表头的表格并进行快照测试。


629-638: 测试滚动内容

使用React Testing Library渲染带有滚动内容的表格并进行快照测试。


650-658: 测试没有警告 - 列为空

使用React Testing Library渲染列为空的表格测试警告。


669-677: 测试不崩溃

使用React Testing Library渲染带有循环引用组件的表格测试不崩溃。


686-692: 测试列对齐

检查表头和表体单元格的文本对齐样式是否正确设置。


706-712: 测试列对齐不应覆盖单元格样式

检查表头和表体单元格的颜色和文本对齐样式是否正确设置。


716-734: 测试隐藏列

检查隐藏列是否正确从DOM中移除。


754-758: 测试行点击事件

使用fireEvent.click模拟行点击事件并检查回调是否被调用。


763-767: 测试行双击事件

使用fireEvent.doubleClick模拟行双击事件并检查回调是否被调用。


772-776: 测试行上下文菜单事件

使用fireEvent.contextMenu模拟行上下文菜单事件并检查回调是否被调用。


781-790: 测试onRowMouseEnter

使用fireEvent.mouseEnter模拟行鼠标进入事件并检查回调是否被调用。


795-804: 测试onRowMouseLeave

使用fireEvent.mouseLeave模拟行鼠标离开事件并检查回调是否被调用。


809-814: 测试没有key的列

检查没有key的列是否正确渲染。


819-828: 测试语法糖

使用React Testing Library渲染使用Column和ColumnGroup组件的表格并进行快照测试。


834-841: 测试transformColumns内部API

使用React Testing Library渲染使用transformColumns的表格并进行快照测试。


847-860: 测试内部columnType

使用React Testing Library渲染带有expandable属性的表格并检查内部列类型。


871-877: 测试internalRefs

使用React Testing Library渲染带有internalRefs的表格。


885-891: 测试列渲染数组

检查渲染数组的列是否正确渲染。


895-904: 测试组件body应传递data-row-key

检查自定义行组件是否正确接收data-row-key属性。


931-935: 测试状态更改渲染

使用React Testing Library渲染带有状态的组件并检查按钮文本。


940-945: 测试原始数据不崩溃

使用React Testing Library渲染带有原始数据的表格测试不崩溃。


988-996: 测试shouldCellUpdate基础用例

使用React Testing Library的renderrerenderfireEvent.click测试shouldCellUpdate功能。


1007-1040: 测试不阻止嵌套子项

使用React Testing Library渲染带有嵌套子项的表格并测试展开/折叠功能。


1060-1072: 测试树形表格中的索引渲染

使用React Testing Library渲染树形表格并检查单元格内容。


1086-1101: 测试悬停树形表格

使用React Testing Library渲染树形表格并模拟鼠标悬停事件。


1116-1136: 测试rowHoverable为false时

使用React Testing Library渲染rowHoverable为false的表格并检查悬停效果。


1141-1151: 测试应获取滚动条大小

使用React Testing Library渲染带有滚动属性的表格并进行快照测试。


1188-1196: 测试列支持JSX条件

使用React Testing Library渲染带有条件列的表格并检查渲染结果。


1309-1316: 测试同时使用列子项和组件body

检查列宽度是否正确计算和设置。


1321-1334: 测试onScroll事件

使用React Testing Library渲染带有滚动属性的表格并模拟滚动事件。

tests/Colgroup.spec.jsx (9)

2-2: 导入React Testing Library的render函数

从React Testing Library导入render函数替代Enzyme的mount,这是向更现代测试库迁移的一部分。


4-4: 直接导入Cell组件

直接从源文件导入Cell组件,简化了导入结构。


14-16: 使用React Testing Library查询DOM

使用render方法和container.querySelector查询DOM元素,替代Enzyme的包装器方法。


20-33: 使用单独的对象定义列

将单一列对象拆分为三个独立的列对象,每个都有自己的key和width属性,使代码更清晰。


35-45: 添加ProxyCell组件跟踪卸载次数

创建一个新的ProxyCell组件,使用React Hook来跟踪卸载事件,这是一个更现代的实现方式。


47-68: 使用React Testing Library的render和rerender方法

使用React Testing Library的API来测试列key的变化如何影响组件的卸载和重新渲染。


69-69: 检查卸载计数

验证组件在列改变时正确卸载,确保不会有内存泄漏或多余的渲染。


79-81: 测试minWidth样式

使用React Testing Library的rendercontainer.querySelector检查col元素的minWidth样式属性。


92-94: 测试tableLayout为fixed时不应有minWidth

检查当tableLayout为fixed时,col元素的minWidth样式属性应为falsy值。

tests/FixedHeader.spec.jsx (7)

1-2: 导入适当的测试库组件

从 Enzyme 迁移到 React Testing Library 是一个很好的现代化测试方法的改进。React Testing Library 鼓励以更接近用户交互方式的测试,这与组件的实现细节耦合较少。


8-13: 异步 triggerResize 函数实现得很好

triggerResize 更新为异步函数并使用 act 包装回调是处理 React 组件状态变化的正确方法。使用 Promise.resolve() 确保所有微任务完成也是一个好实践。


21-28: 从 spyElementPrototype 迁移到 spyElementPrototypes

良好地迁移到 spyElementPrototypes 并添加了 offsetWidth 模拟,以便于在测试中可以基于 visible 状态控制宽度。


53-60: 正确使用 act 进行异步更新

使用 act 包装所有状态更新和计时器运行确保测试同步性,这是当前 React 测试的最佳实践。


62-66: 使用现代 DOM 查询方法

使用 container.querySelectorcontainer.querySelectorAll 替代 Enzyme 的 wrapper.find() 是一个良好的模式转变,更接近真实的 DOM 交互方式。


119-126: 显式处理异步行为

actvi.runAllTimers()Promise.resolve() 一起使用确保了所有异步操作在断言前完成,避免了时间相关的测试不稳定性。


203-206: 简洁的查询和断言

使用 container.querySelectorAll 并适当检查类名存在是一个干净且可读的测试方法。

tests/ExpandRow.spec.jsx (5)

1-2: 导入 React Testing Library 组件

从 Enzyme 的 mount 迁移到 React Testing Library 的 renderfireEvent 是一个很好的现代化测试方法的改进。


171-178: 有效使用 render 函数的返回值

很好地使用了 React Testing Library 的 render 函数返回的 containerrerender 对象进行第二次组件渲染。


237-240: 使用现代 DOM 查询方法进行断言

良好地将 Enzyme 的 wrapper.find()...length 方式替换为 container.querySelectorAll().length,使代码更直观且与实际 DOM 操作更一致。


268-270: DOM 元素查询与类检查

使用 querySelector 进行 DOM 元素查找并检查类名存在与否是直观且符合最佳实践的做法。


531-537: 使用 fireEvent 模拟用户交互

从 Enzyme 的 simulate 更改为 React Testing Library 的 fireEvent.click 更好地模拟了真实用户交互。条件检查确保在元素存在时才执行操作,这是良好的实践。

tests/FixedColumn.spec.tsx (4)

16-16: 添加明确的类型标注

domSpy 添加明确的 TypeScript 类型标注 ReturnType<typeof spyElementPrototypes> 是良好的做法,提高了代码的类型安全性和可读性。


83-95: 使用异步/等待模式和 act

正确地使用 await triggerResize 和包装在 act 中的异步操作,确保所有状态更新都在断言前完成。


214-224: RTL 模式下的类名检查

正确地使用 React Testing Library 的 .toHaveClass() 断言来检查 RTL 模式下的表格样式类。


237-240: 使用 container 检查 DOM 结构

使用 container.querySelectorAll 确认 DOM 结构是直观且易于理解的测试方法。

tests/Cell.spec.tsx (5)

1-2: 导入 React Testing Library

从 Enzyme 迁移到 React Testing Library 是一个很好的改变,使测试更贴近用户交互方式。


37-42: 使用 getByRole 获取元素

使用 getByRole 获取按钮元素是一种更符合可访问性和用户交互的方法,比通过选择器查找更可靠。


58-67: 使用 rerender 更新组件

从 Enzyme 的 setProps 迁移到 React Testing Library 的 rerender 函数更新组件属性是正确的做法。使用 .toHaveClass() 断言检查类名存在也符合最佳实践。


99-104: 使用 textContent 检查文本内容

textContent 替换 Enzyme 的 text() 方法检查文本内容,并使用可选链操作符确保安全访问 DOM 元素,这是良好的实践。


146-150: 类型安全查询与样式检查

使用 querySelector<HTMLTableCellElement> 进行类型安全的查询并直接检查样式属性是直观且有效的测试方法。

);

expect(wrapper.find('.expand-icon')).toHaveLength(1);
expect(container.querySelectorAll('.expand-icon')).toBeTruthy();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

断言逻辑需要更新

当使用 querySelectorAll 时,即使没有匹配的元素,它也会返回一个空的 NodeList,而空 NodeList 在布尔上下文中是真值(truthy)。这可能会导致测试出现假阳性结果。

建议更改断言以检查返回的 NodeList 的长度是否大于 0。

-    expect(container.querySelectorAll('.expand-icon')).toBeTruthy();
+    expect(container.querySelectorAll('.expand-icon').length).toBeGreaterThan(0);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
expect(container.querySelectorAll('.expand-icon')).toBeTruthy();
expect(container.querySelectorAll('.expand-icon').length).toBeGreaterThan(0);

Comment on lines +8 to 13
async function triggerResize(ele: HTMLElement) {
await act(async () => {
_rs([{ target: ele }] as any);
await Promise.resolve();
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

异步 triggerResize 函数实现

triggerResize 更新为异步函数并使用 act 包装状态更新是正确的做法。然而,在第 268 行中存在类型错误。

act(() => {
  container.querySelectorAll('.rc-table-measure-row td').forEach(td => {
-    triggerResize(td);
+    triggerResize(td as HTMLElement);
  });
});

Pipeline 失败提示:error TS2345: Argument of type 'Element' is not assignable to parameter of type 'HTMLElement',需要进行类型断言。

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
async function triggerResize(ele: HTMLElement) {
await act(async () => {
_rs([{ target: ele }] as any);
await Promise.resolve();
});
}
act(() => {
container.querySelectorAll('.rc-table-measure-row td').forEach(td => {
triggerResize(td as HTMLElement);
});
});

@codecov
Copy link

codecov bot commented Mar 7, 2025

Codecov Report

Attention: Patch coverage is 99.58549% with 4 lines in your changes missing coverage. Please review.

Project coverage is 98.04%. Comparing base (7c11736) to head (786f25e).
Report is 1 commits behind head on master.

Files with missing lines Patch % Lines
tests/ExpandRow.spec.jsx 98.87% 2 Missing ⚠️
tests/FixedColumn.spec.tsx 98.50% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1241      +/-   ##
==========================================
+ Coverage   97.77%   98.04%   +0.27%     
==========================================
  Files          76       76              
  Lines        7454     7469      +15     
  Branches     1132     1164      +32     
==========================================
+ Hits         7288     7323      +35     
+ Misses        160      140      -20     
  Partials        6        6              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@zombieJ zombieJ merged commit 15658cc into master Mar 7, 2025
12 checks passed
@zombieJ zombieJ deleted the testing-lib branch March 7, 2025 08:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants