ReactLynx Testing Library 基于 Lynx Test Environment(@lynx-js/test-environment,Lynx 的 JS 实现) 实现了一套 ReactLynx 组件的测试方案。
ReactLynx Testing Library 借鉴了 React Testing Library 的设计。底层的 Lynx Test Environment 负责提供 Lynx 环境的 JS 实现,类似于 jsdom 等工具提供的 DOM 环境。我们在 Lynx Test Environment 中使用了 jsdom 来实现 Element PAPI,因此你可以直接使用 @testing-library/dom、@testing-library/jest-dom 等工具来辅助测试。
ReactLynx Testing Library 适用于对于 ReactLynx 组件的单元测试。它基于 Lynx Test Environment 和 @testing-library/dom(页面元素的查询和事件触发),屏蔽了 Lynx 双线程的实现细节,将 ReactLynx 的渲染流程抽象成 render、fireEvent、screen 等和 React Testing Library 类似的 API。用户也可以对页面中的 Element 进行断言,例如使用 data-testid 来快速寻找元素,使用 @testing-library/jest-dom 中的 toBeInTheDocument 判断元素在页面中。
ReactLynx Testing Library 集成在 @lynx-js/react 包的 testing-library 子目录中,可以直接使用。
配置 Vitest:
如果需要使用 @testing-library/jest-dom 中的 toBeInTheDocument 等方法,你需要安装 @testing-library/jest-dom:
然后你就可以开始编写测试并运行了,下面是一个完整的示例:
这是一个最小化的示例,展示了如何使用 ReactLynx Testing Library 进行测试。
在触发事件时,需要显式指定事件的类型。例如 new Event('catchEvent:tap')(eventType:eventName) 表示触发 catch 类型的 tap 事件,请参考事件处理器属性。eventType 的可能值有:
bindEvent:触发 bind 类型的事件,例如 bindtap 绑定的事件应该使用 new Event('bindEvent:tap') 触发。catchEvent:触发 catch 类型的事件,例如 catchtap 绑定的事件应该使用 new Event('catchEvent:tap') 触发。capture-bind:触发 capture-bind 类型的事件,例如 capture-bindtap 绑定的事件应该使用 new Event('capture-bind:tap') 触发。capture-catch:触发 capture-catch 类型的事件,例如 capture-catchtap 绑定的事件应该使用 new Event('capture-catch:tap') 触发。可以直接自己构造 Event 对象,也可以使用直接传入事件类型和初始化参数让 Testing Library 自动构造 Event 对象。
@testing-library/domReactLynx Testing Library 中导出了 @testing-library/dom,因此你可以直接使用 @testing-library/dom 中的方法来查询页面元素。
list 的使用文档请参考:https://lynxjs.org/zh/api/elements/built-in/list.html
主线程脚本的使用文档请参考:https://lynxjs.org/zh/react/main-thread-script.html
render 方法的第二个参数中支持 enableMainThread 和 enableBackgroundThread 两个选项,用于开启主线程和后台线程。默认情况下 enableMainThread 为 false,enableBackgroundThread 为 true,这样主线程不会渲染首屏,只有后台线程运行完整的 Preact 运行时,并将 UI 更新发送到主线程进行处理。我们之所以不同时开启主线程和后台线程,是因为单元测试并没有和使用 Rspeedy 构建一样将文件编译成两份产物,这样会导致最顶层的代码只能执行一次,并且默认是在后台线程中。假如你写了一个这样的组件:
这个组件最顶层的 isBackground 只会被执行一次,而且默认情况下是 true(Lynx Test Environment 初始化后默认为后台线程),为了避免 enableMainThread: true 时渲染出错误的首屏结果,我们默认将 enableMainThread 设置为 false,得到空首屏,可以避免此问题。
如果确认自己的组件顶层代码没有双线程的差异,建议开启 enableMainThread,这样可以得到正确的首屏结果。
更多用法请参考可以参考 ReactLynx Testing Library 源码中维护的测试用例。
详见 API 参考。