我有一个这样的 rust + wasm 项目:
wasm-pack-example/
pkg/
.gitignore
package.json
wasm_pack_example.d.ts
wasm_pack_example.js
wasm_pack_example_bg.d.ts
wasm_pack_example_bg.js
wasm_pack_example_bg.wasm
src/
lib.rs
Cargo.toml
pkg
我运行时构建的内容wasm-pack build
。
发出的 js 文件不是公共 rust 函数的简单传递——wasm-pack 为它们添加了一些逻辑。它看起来更像是公共 rust 函数的内存管理包装器。
在我的项目中,我现在真正想做的是针对发出的 wasm 的 js 接口编写自动化测试。这就是我的应用程序所做的,也是我需要测试的。我很高兴使用任何测试框架(我一直在用玩笑进行很多实验)。
我已经尝试了许多指南和工具来做到这一点,包括https://github.com/DrSensor/rs-jest,这很有希望,但缺乏测试 wasm-pack 生成的特定 js 接口的能力。此外,它似乎缺乏我的特定库所需要的东西,也许是我使用 wasm_bindgen 的特定方式。根据 rs-jest 实例化 WebAssembly 时,我会看到TypeError: WebAssembly.instantiate(): Imports argument must be present and must be an object
,如果我将一个空对象传递给实例化,我会看到TypeError: WebAssembly.instantiate(): Import #0 module="__wbindgen_placeholder__" error: module is not an object or function
.
我还尝试了一段时间来模拟浏览器使用 JsDom 获取和实例化 wasm 的特定方式。我生成了一个 index.html 文件,该文件通过脚本标签加载了 wasm-pack js 文件,然后我使用该 index.html 文件创建了一个 JsDom 实例。它正确地尝试从 js 中的导入中获取 wasm(这要求我将自己的fetch
实现添加到 JsDom 实例的窗口中,从文件系统中返回 wasm 文件),但随后在 js 文件中途阻塞,因为module.require
不是功能。在那之后我无法取得任何进展。
无论如何,这只是为了表明我无法找到任何解决方案。有没有人能够针对 wasm-pack 生成的 js 接口编写自动化测试?