Rust测试框架函数参考
原文:https://docs.elrond.com/developers/developer-reference/rust-testing-framework-functions-reference
该页面包含 Rust 测试框架所有当前可用函数的列表,特别是那些BlockchainStateWrapper
类型提供的函数。
注意:您会注意到大多数函数使用num_bigint::BigUint
类型表示数字。这与您在智能合约中使用的 BigUint 类型不同。它来自于一个铁锈库,它们是不同的类型。建议总是在 lambda 函数之外使用 Rust 版本,并且只在直接与 sc 交互时使用托管类型。
状态检查功能
这些函数检查区块链状态。如果检查不成功,他们将会死机,测试也将失败。
检查 _ egld _ 余额
check_egld_balance(&self, address: &Address, expected_balance: &num_bigint::BigUint)
检查给定地址的 EGLD 余额。
检查 _ esdt _ 余额
check_esdt_balance(&self, address: &Address, token_id: &[u8], expected_balance: &num_bigint::BigUint)
检查给定地址的可替换 ESDT 余额。
支票 _ nft _ 余额
check_nft_balance<T>(&self, address: &Address, token_id: &[u8], nonce: u64, expected_balance: &num_bigint::BigUint, opt_expected_attributes: Option<&T>)
其中 T 必须实现 TopEncode、TopDecode、PartialEq 和 core::fmt::Debug。这通常通过#[derive(TopEncode, TopDecode, PartialEq, Debug)]
来完成。
此函数检查某个地址的特定随机数的 NFT 余额,并且还可以选择检查 NFT 属性。如果您只对余额感兴趣,请将opt_expected_attributes
传递给Option::None
。Rust 编译器可能会抱怨它无法推导出泛型T
,在这种情况下,您可以执行以下操作之一:
b_mock.check_nft_balance::<Empty>(..., None);
b_mock.check_nft_balance(..., Option::<Empty>::None);
其中...
是其余的参数。
状态-getter 函数
这些函数获取当前状态。它们通常在交易后用于检查代币是否到达其预期目的地。如果给定一个无效的地址作为参数,大多数函数都会死机。
get _ egld _ balance
get_egld_balance(&self, address: &Address) -> num_bigint::BigUint
获取给定帐户的 EGLD 余额。
get _ esdt _ balance
get_esdt_balance(&self, address: &Address, token_id: &[u8], token_nonce: u64) -> num_bigint::BigUint
获取给定帐户的 ESDT 余额。如果您对可替换代币余额感兴趣,请将token_nonce
设置为 0。
获取 _ nft _ 属性
get_nft_attributes<T: TopDecode>(&self, address: &Address, token_id: &[u8], token_nonce: u64) -> Option<T>
获取给定地址所拥有的代币的 NFT 属性。如果没有属性,将返回Option::None
。
转储 _ 状态
dump_state(&self)
将当前状态打印到控制台。对调试有用。
转储 _ 状态 _ 账户 _ 十六进制 _ 属性
dump_state_for_account_hex_attributes(&self, address: &Address)
类似于前面的函数,但是只转储给定帐户的状态。
dump _ state _ for _ account
dump_state_for_account<AttributesType: TopDecode + core::fmt::Debug>(&self, address: &Address)
类似于前面的函数,但是以用户友好的格式打印属性,由给定的泛型类型给出。这对调试 NFT 属性很有用。
状态改变功能
这些函数以某种方式改变状态。
创建 _ 用户 _ 账户
create_user_account(&mut self, egld_balance: &num_bigint::BigUint) -> Address
用给定的 EGLD 余额创建一个新的用户帐户。该地址由框架伪随机生成。
创建 _ 用户 _ 账户 _ 固定 _ 地址
create_user_account_fixed_address(&mut self, address: &Address, egld_balance: &num_bigint::BigUint)
与上面的功能相同,但是它允许你创建一个有固定地址的账户,以备不时之需。
创建 _ 供应链 _ 账户
create_sc_account<CB, ContractObjBuilder>(&mut self, egld_balance: &num_bigint::BigUint, owner: Option<&Address>, obj_builder: ContractObjBuilder, contract_wasm_path: &str) -> ContractObjWrapper<CB, ContractObjBuilder>
其中:
CB: ContractBase<Api = DebugApi> + CallableContract + 'static,
ContractObjBuilder: 'static + Copy + Fn() -> CB,
创建智能合约帐户。对于obj_builder
,你必须通过sc_namespace::contract_obj
。该函数将返回一个ContractObjWrapper
,其中包含新创建的 SC 的地址,以及用于创建您的合约实例的函数。
当您通过执行功能与 SC 交互时,将使用ContractObjWrapper
。如果您只需要地址(例如,用于设置平衡),您可以使用address_ref
方法来获取对存储地址的引用。
contract_wasm_path
是 wasm 文件的路径。该路径相对于当前测试文件所在的tests
文件夹。最常见的路径将是ouput/wasm_file_name.wasm
。
创建 _ 供应链 _ 账户 _ 固定 _ 地址
create_sc_account_fixed_address<CB, ContractObjBuilder>(&mut self, address: &Address, egld_balance: &num_bigint::BigUint, owner: Option<&Address>, obj_builder: ContractObjBuilder, contract_wasm_path: &str) -> ContractObjWrapper<CB, ContractObjBuilder>
与上面的函数相同,但是地址可以由调用者设置,而不是随机生成。
set _ egld _ balance
set_egld_balance(&mut self, address: &Address, balance: &num_bigint::BigUint)
设置给定帐户的 EGLD 余额。
set _ esdt _ balance
set_esdt_balance(&mut self, address: &Address, token_id: &[u8], balance: &num_bigint::BigUint)
为给定帐户设置可替换的代币余额。
set _ NFT _ balance
set_nft_balance<T: TopEncode>(&mut self, address: &Address, token_id: &[u8], nonce: u64, balance: &num_bigint::BigUint, attributes: &T)
为给定帐户设置不可替换的代币余额和属性。属性可以是任何可序列化的类型。如果不需要属性,可以通过各种方式传递“空”:&()
、&Vec::<u8>::new()
、BoxedBytes::empty()
等。
设置 _ esdt _ 本地 _ 角色
set_esdt_local_roles(&mut self, address: &Address, token_id: &[u8], roles: &[EsdtLocalRole])
为给定的地址和代币设置 ESDT 代币角色。通常在设置步骤中使用。
set _ block _ epoch
set_block_epoch(&mut self, block_epoch: u64)
set _ block _ nonce
et_block_nonce(&mut self, block_nonce: u64)
set _ block _ round
set_block_round(&mut self, block_round: u64)
设置 _ 块 _ 时间戳
set_block_timestamp(&mut self, block_timestamp: u64)
设置 _ 阻止 _ 随机 _ 种子
set_block_random_seed(&mut self, block_random_seed: Box<[u8; 48]>)
为当前块信息设置各种值。
set _ prev _ block _ epoch
set_prev_block_epoch(&mut self, block_epoch: u64)
set _ prev _ block _ nonce
set_prev_block_nonce(&mut self, block_nonce: u64)
set _ prev _ block _ round
set_prev_block_round(&mut self, block_round: u64)
set _ prev _ block _ timestamp
set_prev_block_timestamp(&mut self, block_timestamp: u64)
集合 _ 前一个 _ 块 _ 随机 _ 种子
set_prev_block_random_seed(&mut self, block_random_seed: Box<[u8; 48]>)
与上面的相同,但是设置前一个块的块信息。
智能合约执行功能
这些功能有助于与智能合约进行交互。虽然它们仍然属于改变状态的类别,但我们认为它们应该有自己的部分。
注意:我们将通过不指定 ContractObjWrapper 的完整类型来缩短签名。作为参考,合约包装器的类型是ContractObjWrapper<CB, ContractObjBuilder>
,其中
CB: ContractBase<Api = DebugApi> + CallableContract + 'static,
ContractObjBuilder: 'static + Copy + Fn() -> CB,
execute _ tx
execute_tx(&mut self, caller: &Address, sc_wrapper: &ContractObjWrapper<...>, egld_payment: &num_bigint::BigUint, tx_fn: TxFn) -> TxResult
对给定的 SC(由包装器定义)执行交易,并使用可选的 EGLD 付款(如果不想付款,则传递 0)。tx_fn
是一个 lambda 函数,它接受一个合约对象作为参数。关于如何编写这样一个 lambda 的更多细节,你可以看看众筹测试示例。
执行 _ esdt _ 转移
execute_esdt_transfer(&mut self, caller: &Address, sc_wrapper: &ContractObjWrapper<...>, token_id: &[u8], esdt_nonce: u64, esdt_amount: &num_bigint::BigUint, tx_fn: TxFn) -> TxResult
与上面的函数相同,但是执行 ESDT/NFT 转移,而不是 EGLD 转账。
执行 _ esdt _ 多 _ 转移
execute_esdt_multi_transfer(&mut self, caller: &Address, sc_wrapper: &ContractObjWrapper<...>, esdt_transfers: &[TxInputESDT], tx_fn: TxFn) -> TxResult
与上面的函数相同,但改为执行 MultiESDTNFT 传输。
执行 _ 查询
execute_query(&mut self, sc_wrapper: &ContractObjWrapper<...>, query_fn: TxFn) -> TxResult
在 SC 上执行 SCQuery。没有任何更改被提交到状态中,但是它仍然需要是一个可变函数来执行临时更改。就像在真正的区块链上一样,查询没有调用者,也没有代币传输。
执行 _ 环境 _ 管理 _ 环境
execute_in_managed_environment(&self, f: Func) -> T
执行任意函数并返回结果。结果可以是任何类型。这个功能很少使用。当您想要执行一些涉及托管类型之类的检查时,它会很有用。(因为不能在 lambda 函数之外创建托管类型)。
无证函数
还有一些 mandos 生成函数没有包括在内,但是我们建议不要为 mandos 生成而烦恼。这个过程非常耗时,结果是一些不可读的 mandos 文件。如果需要写 mandos,我们建议自己写。如果你还想涉足 mandos 一代,在众筹测试示例中有一些例子。