You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在TypeScript单元测试中访问WebAssembly文件?

在Mocha单元测试中加载WASM文件到TypeScript库的解决方案

我懂你现在的困扰——平时在浏览器里靠GET请求加载signal.wasm顺风顺水,但到了Mocha的单元测试环境,没有服务器托底,TypeScript直接找不到这个文件。结合你的包结构,我给你几个落地可行的解决思路:

方法一:用Node.js原生API读取本地WASM文件

既然Mocha跑在Node.js环境里,我们可以直接用文件系统读取WASM文件,再通过WebAssembly API编译加载。同时给库做个环境判断,兼容浏览器和测试场景:

  1. 修改src/mypackage.ts的加载逻辑:
import * as fs from 'fs';
import * as path from 'path';

export async function loadSignalWasm() {
  let wasmBytes: Uint8Array;
  
  // 浏览器环境:沿用fetch加载逻辑
  if (typeof window !== 'undefined') {
    const response = await fetch('/signal.wasm');
    wasmBytes = new Uint8Array(await response.arrayBuffer());
  } 
  // Node.js/测试环境:直接读取本地文件
  else {
    // 根据当前文件路径定位到同级的signal.wasm
    const wasmFilePath = path.join(__dirname, './signal.wasm');
    wasmBytes = fs.readFileSync(wasmFilePath);
  }

  const { instance } = await WebAssembly.instantiate(wasmBytes);
  return instance.exports;
}
  1. test/test.ts里直接调用测试:
import { loadSignalWasm } from '../src/mypackage';
import { expect } from 'chai';

describe('WASM信号处理模块', () => {
  let wasmExports: any;

  // 测试前先加载WASM实例
  before(async () => {
    wasmExports = await loadSignalWasm();
  });

  it('应该成功初始化WASM模块', () => {
    expect(wasmExports).to.exist;
    // 这里可以测试具体的信号处理函数,比如wasmExports.processAudioBuffer()
  });
});
  1. 确保tsconfig.json开启Node.js类型支持:
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "CommonJS",
    "types": ["node", "mocha"]
  }
}

方法二:用无头Chrome模拟浏览器环境

如果你不想修改库的加载逻辑,也可以直接用无头Chrome模拟浏览器的fetch环境跑测试:

  1. 安装依赖:
npm install mocha-headless-chrome --save-dev
  1. 创建浏览器可加载的测试入口test/test.html
<!DOCTYPE html>
<html>
<head>
  <title>WASM单元测试</title>
  <script src="../node_modules/mocha/mocha.js"></script>
  <script src="../node_modules/chai/chai.js"></script>
  <script>mocha.setup('bdd');</script>
  <!-- 加载编译后的库文件 -->
  <script src="../dist/mypackage.js"></script>
  <!-- 加载测试逻辑 -->
  <script src="./test.js"></script>
</head>
<body>
  <div id="mocha"></div>
  <script>mocha.run();</script>
</body>
</html>
  1. 在package.json里添加测试脚本:
{
  "scripts": {
    "test": "mocha-headless-chrome -f test/test.html"
  }
}

这样就能和浏览器环境完全一致,用fetch加载WASM文件了。

方法三:用@wasm-tool/node简化加载流程

还有个专门处理Node.js环境WASM加载的工具包,能帮你省去环境判断的代码:

  1. 安装依赖:
npm install @wasm-tool/node --save-dev
  1. src/mypackage.ts里直接导入WASM文件:
import loadWasm from './signal.wasm';

export async function getSignalProcessor() {
  const wasmInstance = await loadWasm();
  return wasmInstance.exports;
}
  1. 在tsconfig.json里开启相关配置:
{
  "compilerOptions": {
    "resolveJsonModule": true,
    "esModuleInterop": true
  }
}

这个工具会自动处理WASM文件的读取和实例化逻辑,不用你自己写环境分支。


内容的提问来源于stack exchange,提问作者Cerin

火山引擎 最新活动