跳转至

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 一代,在众筹测试示例中有一些例子。



回到顶部