Lynx Test Environment

@lynx-js/test-environmentLynx Spec 的纯 JavaScript 实现,包含用于 Node.js 的 Element PAPIDual-threaded Model 实现。该项目的目标是模拟 Lynx 环境,以便用于测试。

Lynx Test Environment 中的 Element PAPI 实现基于 jsdom,例如 __CreateElement 将返回一个 LynxElement,它从 jsdom 扩展了 HTMLElement。你可以复用常用于 DOM 测试工具,例如 @testing-library/dom(页面元素的查询和事件触发)和 @testing-library/jest-dom(用于 DOM 的自定义 jest 匹配器)等。

用法

import { LynxEnv } from '@lynx-js/test-environment';

const lynxEnv = new LynxEnv();

要使用 @lynx-js/test-environment,你将主要使用其中导出的 LynxEnv 构造函数。你会得到一个 LynxEnv 实例,它具有许多有用的属性方法,特别是 switchToMainThreadswitchToBackgroundThread,它们允许你在主线程和后台线程之间切换。

使用后台线程 API:

lynxEnv.switchToBackgroundThread();
// 使用后台线程全局对象
globalThis.lynxCoreInject.tt.OnLifecycleEvent(...args);
// 或者直接使用 `lynxCoreInject`,因为它已经注入到 `globalThis`
// lynxCoreInject.tt.OnLifecycleEvent(...args);

使用主线程 API:

lynxEnv.switchToMainThread();
// 使用主线程 Element PAPI
const page = __CreatePage('0', 0);
const view = __CreateView(0);
__AppendElement(page, view);

请注意,你仍然可以访问其他线程的全局变量而无需切换线程:

lynxEnv.switchToMainThread();
// 即使我们在主线程上,也可以使用 `backgroundThread` 全局对象
lynxEnv.backgroundThread.tt.OnLifecycleEvent(...args);

在 Vitest 中使用

推荐作为 Vitest 的测试环境进行配置,例如:

vitest.config.js
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    environment: require.resolve('@lynx-js/test-environment/env/vitest'),
  },
});

配置好之后,在测试中可以直接全局访问 lynxEnv 对象。

@lynx-js/react/testing-library 中已经包含了 @lynx-js/test-environment

如果你想在 ReactLynx 中进行单元测试,@lynx-js/react/testing-library 中已经包含了 @lynx-js/test-environment,因此你不需要手动指定此配置。

请参考 ReactLynx Testing Library@lynx-js/react/testing-library 进行配置。

API 参考

详见 API 参考

除非另有说明,本项目采用知识共享署名 4.0 国际许可协议进行许可,代码示例采用 Apache License 2.0 许可协议进行许可。