rust 可以从javascript上下文测试wasm-pack生成的webassembly吗?

6ie5vjzr  于 2023-03-12  发布在  Java
关注(0)|答案(1)|浏览(155)

我有一个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接口编写自动化测试?

2izufjch

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:

wasm-pack build --target bundler --out-dir pkg  # (the defaults)
wasm-pack build --target nodejs --out-dir pkg_node

然后在我的package.json中,我指向bundler/web绑定:

{
  "dependencies": {
    "foo_wasm": "file:../wasm/foo/pkg",
  }
}

在jest.config.ts中,我用节点绑定覆盖它:

export default {
  moduleNameMapper: {
    foo_wasm: "<rootDir>/../wasm/foo/pkg_node",
  },
};

那么在我的测试中,我只能import * as wasm from "foo_wasm";
参见this wasm-pack issue,它将添加--target all,这样我们就不必运行wasm-pack两次。

相关问题