Jest测试集成Stencil SQLite DB遇wasm文件加载错误求助
问题解答
1. 现有代码的明显错误
- 重复创建SQLiteConnection实例:测试代码里两次声明
const sqlite: SQLiteConnection = new SQLiteConnection(CapacitorSQLite);,属于冗余代码,会覆盖前一个实例,可能引发意外问题。 - WASM路径设置错误:用
resolve获取的本地文件系统绝对路径,在JSDom环境下会被当作HTTP请求路径(比如http://127.0.0.1/xxx/sql-wasm.wasm),但测试时未启动本地静态服务器,导致请求被拒绝(ECONNREFUSED)。JSDom无法直接读取本地文件系统资源,必须通过HTTP服务访问或mock资源。 - 组件初始化逻辑冗余:
customElements.whenDefined('jeep-sqlite')返回的是Promise<void>,不需要赋值给element变量。 - 未处理Capacitor环境适配:Capacitor的SQLite插件原生依赖在Jest的Node/JSDom环境中不可用,直接使用会导致环境不兼容问题。
2. Jest中运行Stencil库的推荐方式
- 必须在JSDom中挂载组件:Stencil生成的是标准Web组件,依赖完整DOM环境,Jest需配置
jest-environment-jsdom(React项目通常已默认配置)。 - 全局初始化自定义元素:将
applyPolyfills().then(() => jeepSqlite(window, {}))移到Jest全局setup文件(比如src/setupTests.ts),避免每个测试文件重复执行,确保所有测试前组件已完成注册。 - Mock Capacitor与WASM依赖:
优先mock@capacitor-community/sqlite的核心方法,避开真实初始化WASM和数据库连接,示例:
若必须测试真实逻辑,可在测试前启动本地静态服务器(比如用jest.mock('@capacitor-community/sqlite', () => ({ CapacitorSQLite: { echo: jest.fn().mockResolvedValue({ value: 'test' }), }, SQLiteConnection: jest.fn().mockImplementation(() => ({ initWebStore: jest.fn().mockResolvedValue({}), createConnection: jest.fn().mockResolvedValue({ open: jest.fn().mockResolvedValue({}), // 按需模拟其他方法 }), })), }));serve包),将wasmPath设置为服务器HTTP路径(比如http://localhost:3000/assets/sql-wasm.wasm)。
3. 测试Web组件的常见注意事项
- 确保组件注册完成:测试前等待
customElements.whenDefined('组件名')完成,避免操作未注册的组件。 - 处理异步初始化:Web组件的
connectedCallback、属性变更可能包含异步逻辑,需用waitFor(React Testing Library)或async/await配合延迟等待组件就绪。 - 清理测试环境:每个测试结束后,从DOM中移除挂载的组件,重置mock,避免测试用例间的污染。
- Mock外部依赖:对于依赖WASM、原生API、网络请求的组件,优先mock这些依赖,避免测试依赖外部资源或环境。
- 避免直接操作DOM:尽量使用React Testing Library等工具通过用户交互方式测试组件,而非直接修改DOM属性。
- 适配JSDom限制:JSDom对部分Web API(比如WASM、Shadow DOM部分特性)支持有限,若遇兼容性问题,优先考虑mock相关功能。
内容的提问来源于stack exchange,提问作者EchoNano
相关产品推荐
相关产品推荐

