gpt4 book ai didi

unit-testing - 如何在 Rust 代码中比较两个 JsValues 的值?

转载 作者:行者123 更新时间:2023-11-29 08:26:36 24 4
gpt4 key购买 nike

在 JavaScript 中,我可以这样做:

JSON.stringify([1,2,3]) ===  JSON.stringify([1,2,3]) // true

在 Rust 编译为 Wasm 时,我尝试了类似的方法:

#[wasm_bindgen_test]
fn test_algo() {
let js_array_to_sort = Array::of3(&JsValue::from(1), &JsValue::from(3), &JsValue::from(2));
let js_array_after_sort = Array::of3(&JsValue::from(1), &JsValue::from(2), &JsValue::from(3));
let array = JsValue::from(&js_array_to_sort);

assert_eq!(
JSON::stringify(BubbleSort::sort(SortArray::new(array))).unwrap(),
JSON::stringify(JsValue::from(&js_array_after_sort)).unwrap(),
);
}

wasm-pack test --chrome 引发了一些关于 JsString 没有 partialeq 的错误 - JSON 的结果: :字符串化:

 error[E0277]: can't compare `js_sys::JsString` with `js_sys::JsString`
--> src/algorithms/bubble.rs:36:5
|
36 | / assert_eq!(
37 | | JSON::stringify(&BubbleSort::sort(SortArray::new(array))).unwrap(),
38 | | JSON::stringify(&JsValue::from(&js_array_after_sort)).unwrap(),
39 | | );
| |______^ no implementation for `js_sys::JsString == js_sys::JsString`
|
= help: the trait `std::cmp::PartialEq` is not implemented for `js_sys::JsString`

如果我尝试转换为字符串并以其他方式进行比较(比如直接使用 JsString 方法),我总是会遇到相同类型的编译错误。

如果我尝试直接比较这个数组,我在 JavaScript 中有类似的行为:

JsValue([1,2,3]) == JsValue([1,2,3]) // false

Cargo.toml 我有:

[dependencies]
wasm-bindgen = "0.2.39"
js-sys = "0.3.16"
wasm-bindgen-test = "0.2.39"

如何进行这种比较?

编辑。

我想出了这样的东西来通过这个测试:

  assert_eq!(
String::from(JSON::stringify(&BubbleSort::sort(SortArray::new(array))).unwrap()),
String::from(JSON::stringify(&JsValue::from(&js_array_after_sort)).unwrap()),
);

最佳答案

尝试来自 js_sys 的 Object::is(&first, &second)

您可以使用 JSON::stringify(...) 然后以与在 JavaScript 中类似的方式进行比较

#[wasm_bindgen_test]
fn test_algo() {
let js_array_to_sort = Array::of3(&JsValue::from(1), &JsValue::from(2), &JsValue::from(3));
let js_array_after_sort = Array::of3(&JsValue::from(1), &JsValue::from(2), &JsValue::from(3));
let to_array = JsValue::from(&js_array_to_sort);
let from_array = JsValue::from(&js_array_after_sort);
let to_str: JsString = JSON::stringify(&to_array).unwrap();
let from_str: JsString = JSON::stringify(&from_array).unwrap();
assert_eq!(to_str == from_str, true);
assert_eq!(Object::is(&to_str, &from_str), true);
}

请使用您自己的排序算法。我已经将值作为排序进行比较,如果没有排序那么你可以看到断言错误。

关于unit-testing - 如何在 Rust 代码中比较两个 JsValues 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55172558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com