tests/web.rs

web.rs is an integration test defined with Cargo that is intended to be run in a headless web browser via the wasm-pack test command.

It contains three key parts:

  1. #[wasm_bindgen_test] functions
  2. Crate Configuration
  3. #![cfg] directives

1. #[wasm_bindgen_test] functions

The #[wasm_bindgen_test] is like the normal Rust #[test] attribute, except it defines a test accessible to WebAssembly and headless web browser testing.

Note: Eventually #[test] will work with WebAssembly as well! Currently though custom test frameworks are not stable.


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

Here the pass function is a unit test which asserts that arithmetic works in WebAssembly like we'd expect everywhere else. If the test panics (such as the assert_eq! being false) then the test will fail, otherwise the test will succeed.

The reference documentation for #[wasm_bindgen_test] should have more information about defining these tests.

2. Crate Configuration

Other than the test in this module, we'll also see:


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

wasm_bindgen_test_configure!(run_in_browser);
#}

Like we saw earlier in src/lib.rs the * import pulls in everything from wasm_bindgen_test, notably the wasm_bindgen_test_configure macro and the wasm_bindgen_test attribute.

The wasm_bindgen_test_configure macro (denoted by ending in !) is used to indicate that the test is intended to execute in a web browser as opposed to Node.js, which is the default.

3. #![cfg] directives

The last part we'll notice about this crate is this statement at the top:


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

This statement means that the test is only intended for the wasm32 architecture, or the wasm32-unknown-unknown target. This enables cargo test to work in your project if the library is also being developed for other platforms by ensuring that these tests only execute in a web browser.