You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:47:53