tests/web.rs

web.rs 是一個整合測試,使用 Cargo 定義,旨在透過 wasm-pack test 命令在無頭網頁瀏覽器中執行。

它包含三個關鍵部分

  1. #[wasm_bindgen_test] 函式
  2. Crate 設定
  3. #![cfg] 指令

1. #[wasm_bindgen_test] 函式

#[wasm_bindgen_test] 類似於 一般的 Rust #[test] 屬性,不同之處在於它定義了一個可供 WebAssembly 和無頭網頁瀏覽器測試存取的測試。

注意:最終 #[test] 也將與 WebAssembly 兼容!但目前 自定義測試框架 還不穩定。


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen_test]
fn pass() {
    assert_eq!(1 + 1, 2);
}
#}

這裡的 pass 函式是一個單元測試,它斷言 WebAssembly 中的算術運算與我們期望在其他地方一樣。如果測試出現 panic(例如 assert_eq! 為假),則測試將失敗,否則測試將成功。

#[wasm_bindgen_test] 的參考文件 應該有更多關於定義這些測試的資訊。

2. Crate 設定

除了這個模組中的測試之外,我們還會看到


# #![allow(unused_variables)]
#fn main() {
use wasm_bindgen_test::*;

wasm_bindgen_test_configure!(run_in_browser);
#}

就像我們之前在 src/lib.rs 中看到的一樣,* 導入會從 wasm_bindgen_test 中引入所有內容,特別是 wasm_bindgen_test_configure 巨集和 wasm_bindgen_test 屬性。

wasm_bindgen_test_configure 巨集(以 ! 結尾表示)用於指示測試旨在在網頁瀏覽器中執行,而不是預設的 Node.js。

3. #![cfg] 指令

我們會注意到的關於這個 Crate 的最後一部分是頂部的這個語句


# #![allow(unused_variables)]
#![cfg(target_arch = "wasm32")]
#fn main() {
#}

這個語句表示測試僅適用於 wasm32 架構,或 wasm32-unknown-unknown 目標。這可以讓 cargo test 在您的專案中運作,即使函式庫也正在為其他平台開發,方法是確保這些測試僅在網頁瀏覽器中執行。