1 个稳定版本
1.0.0 | 2023年2月7日 |
---|
#13 在 #fvm
用于 fvm-macros
93KB
2K SLoC
fvm-mock
fvm-mock 是开发者用于本地检查合约逻辑是否正确的工具,适用于 hyperchain。
示例合约
use macros::contract;
use macros::storage;
use fvm_std::runtime;
use scale::{Decode, Encode};
#[storage]
pub struct TestHello {}
#[contract]
impl TestHello {
fn new() -> Self {
Self {}
}
// 将键值对的键名加上test前缀再存入
pub fn set(&mut self, key: String, value: String) {
runtime::storage_write(key.as_bytes(), "test".as_bytes(), value.as_bytes())
}
// 读取存入的数据
pub fn get(&mut self, key: String) -> Vec<u8> {
return if let Some(res) = runtime::storage_read(key.as_bytes(), "test".as_bytes()) {
res
} else {
vec![]
};
}
}
为了本地测试,我们需要做以下操作
- 在
cargo.toml
中添加依赖项
[dev-dependencies]
# ... other dependencies
fvm-mock = "xxx"
- 在单元测试中调用
build_runtime()
#[cfg(test)]
mod tests {
use scale::{Decode, Encode};
use crate::TestHello;
use fvm_mock::build_runtime;
#[test]
fn test_set() {
let mut contract = TestHello::new();
let handle = build_runtime();
contract.set("hello".to_string(), "world".to_string());
assert_eq!("world".as_bytes(), contract.get("hello".to_string()).as_slice())
}
#[test]
fn test_get() {
let mut contract = TestHello::new();
let handle = build_runtime();
handle.storage_write("hello", "test", "world");
assert_eq!("world".as_bytes(), contract.get("hello".to_string()).as_slice())
}
}
请注意,如果您能够通过单元测试,这表明逻辑是正确的,但这并不能表示它可以在区块链上良好运行。因为有一些规范WASM核心支持不好,所以开发者应该确保您不使用它们,例如 打印到控制台
, 文件读取
等。
依赖项
~6.5MB
~114K SLoC