我有一个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
当我运行wasm-pack build
时,pkg
的内容被构建。
发出的js文件并不是简单的公共rust函数的传递wasm-pack给它们添加了一些逻辑,它看起来更像是公共rust函数上的内存管理 Package 器。
在我的项目中,我现在真正想做的是编写针对js接口的自动测试,这是我的应用程序所做的,也是我需要测试的,我很乐意使用任何测试框架(我已经用jest做了很多这样的实验)。
我尝试了许多指南和工具来实现这一点,包括https://github.com/DrSensor/rs-jest,它很有前途,但缺乏测试wasm-pack生成的特定js接口的能力。此外,它似乎缺乏我的特定lib所需的东西,可能是在我使用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接口编写自动化测试?
1条答案
按热度按时间2izufjch1#
我的情况也一样,我使用wasm-pack和Jest,但不使用rs-jest,我只想针对wasm-pack生成的JavaScript包编写Jest测试。
我无法使用Jest
testEnvironment: "jsdom"
和wasm-pack build
进行测试:Jest会抱怨它在import * as wasm from "foo_wasm";
上找不到模块'foo_wasm'。但是,在jest.config.ts中设置
testEnvironment: "node"
并运行wasm-pack build --target nodejs
对我很有效!但是,我的web应用程序确实需要
--target bundler
,所以我运行了两次wasm-pack:然后在我的package.json中,我指向bundler/web绑定:
在jest.config.ts中,我用节点绑定覆盖它:
那么在我的测试中,我只能
import * as wasm from "foo_wasm";
。参见this wasm-pack issue,它将添加
--target all
,这样我们就不必运行wasm-pack两次。