ReactLynx Testing Library
@lynx-js/react/testing-library 包适用于对 ReactLynx 组件的渲染结果进行测试。它提供了和 React Testing Library 相同的 API,例如 render、fireEvent、screen 等,其底层使用了 @lynx-js/testing-environment 包来提供 Lynx 环境的 JS 实现,屏蔽了 Lynx 双线程的实现细节。
配置
从 create-rspeedy 创建新项目
使用 create-rspeedy 创建的项目,在创建时可以主动选择是否使用 ReactLynx Testing Library(默认勾选),勾选后创建出来的项目已经配置好了 ReactLynx Testing Library。
在已有项目中配置
ReactLynx Testing Library 集成在 @lynx-js/react 包的 testing-library 子目录中,无需额外安装其他包。
配置 Vitest 时需要使用 @lynx-js/react/testing-library/vitest-config 中的 createVitestConfig 方法来创建 Vitest 配置。你可以通过 mergeConfig 方法将其和其他配置合并。
示例
快速开始
和 React Testing Library 一样,我们推荐将测试用例分为安排、操作 和断言 三个部分。安排部分用于准备测试数据,操作部分用于执行测试操作,断言部分用于断言测试结果。下面是一个简单的示例:
在这个示例中,你可能已经注意到了我们用到了第三方包 @testing-library/jest-dom 中的 toHaveTextContent 方法来断言元素的文本内容。在 React Testing Library 中,你可以使用 @testing-library/jest-dom 是因为测试框架会使用 JSDOM 来创建 DOM 元素;在 ReactLynx Testing Library 中,我们同样使用了 JSDOM 来实现 Element PAPI 的行为,因此和 DOM API 完全兼容。
基础渲染
render 方法用于渲染一个 ReactLynx 组件,并返回一个 RenderResult 对象,其中的 container 字段是一个 LynxElement,表示渲染结果的根元素。
事件触发
在使用 fireEvent 触发事件时,需要显式指定事件的类型。例如 new Event('catchEvent:tap')(eventType:eventName) 表示触发 catch 类型的 tap 事件,请参考事件处理器属性。eventType 的可能值和使用场景如下:
可以直接自己构造 Event 对象,也可以使用直接传入事件类型和初始化参数让 Testing Library 自动构造 Event 对象。
在 render 过程中,事件处理器会被挂载到 LynxElement 的 eventMap 属性上,因此可以通过 eventMap 属性来获取元素的事件处理器,用于断言事件处理器是否被正确挂载。
测试 Ref
在 ReactLynx Testing Library 中,可以对渲染结果和元素对应的 ref 对象进行快照测试来判断其是否被正确设置。
页面元素查询
你可以使用 screen 对象来查询页面元素,它提供了一些常用的方法,例如 getByText、getByTestId 等。还有像 waitForElementToBeRemoved 这样的方法对页面元素状态进行等待。
在这个例子中,我们使用 waitForElementToBeRemoved 方法来等待 Loading... 元素被移除,此时页面中会渲染出 Loaded this message: Hello World! 元素。这时我们可以用 screen.getByTestId 方法来获取页面中的元素,并断言其文本内容是否正确。
rerender
render 方法返回的对象中包含 rerender 方法,可以用于重新渲染页面。rerender 方法会将新的组件渲染到页面中,并返回一个新的对象。可以使用 rerender 方法来测试组件的不同状态。
不同于 React Testing Library,container 需要在 rerender 之后重新获取,因为 ReactLynx 每次加载都会创建一个新的 page 元素。
测试 list
由于 list 下的 list-item 元素是懒加载的,只有元素进入视口时才会被加载,离开视口时会被标记为可回收,在测试框架中可以使用 elementTree.enterListItemAtIndex 和 elementTree.leaveListItem 方法来模拟列表项元素的加载和回收。