Rust测试工具库fuels-test-helpers的使用:简化fuels生态开发中的测试辅助功能
Rust测试工具库fuels-test-helpers的使用:简化fuels生态开发中的测试辅助功能
安装
在项目目录中运行以下Cargo命令:
cargo add fuels-test-helpers
或者在Cargo.toml中添加以下行:
fuels-test-helpers = "0.74.0"
基本信息
- 版本: 0.74.0
- 许可: Apache-2.0
- 大小: 57.5 KiB
- 最低Rust版本: v1.85.0
示例代码
use fuels_test_helpers::test_helper::setup_test_provider;
#[tokio::test]
async fn test_fuels_contract() {
// 设置测试环境
let provider = setup_test_provider().await;
// 部署合约
let contract_id = Contract::deploy(
"path/to/contract.bin",
&provider,
TxParameters::default(),
)
.await
.unwrap();
// 调用合约方法
let instance = MyContract::new(contract_id, provider);
let result = instance.some_method().call().await.unwrap();
// 断言结果
assert_eq!(result.value, expected_value);
}
// 更复杂的测试示例
#[tokio::test]
async fn test_multiple_contract_interaction() {
let provider = setup_test_provider().await;
// 部署多个合约
let contract_a = ContractA::deploy(
"path/to/contract_a.bin",
&provider,
TxParameters::default(),
)
.await
.unwrap();
let contract_b = ContractB::deploy(
"path/to/contract_b.bin",
&provider,
TxParameters::default(),
)
.await
.unwrap();
// 测试合约间交互
let instance_a = ContractA::new(contract_a, provider.clone());
let instance_b = ContractB::new(contract_b, provider);
// 调用合约A的方法,触发合约B
let result = instance_a
.call_contract_b(instance_b.contract_id())
.call()
.await
.unwrap();
// 验证状态变化
let state = instance_b.get_state().call().await.unwrap();
assert_eq(state.value, expected_state);
}
主要功能
fuels-test-helpers提供以下测试辅助功能:
setup_test_provider()
- 快速设置测试用的燃料节点提供者- 合约部署和交互的简化方法
- 交易参数和配置的默认值
- 测试环境自动清理
完整示例demo
以下是一个完整的测试示例,展示了如何使用fuels-test-helpers测试一个简单的计数器合约:
use fuels::{contract::contract::Contract, prelude::*};
use fuels_test_helpers::test_helper::setup_test_provider;
// 定义合约ABI
abigen!(
CounterContract,
"path/to/counter_contract_abi.json"
);
#[tokio::test]
async fn test_counter_contract() {
// 1. 设置测试环境
let provider = setup_test_provider().await;
// 2. 部署计数器合约
let contract_id = Contract::deploy(
"path/to/counter_contract.bin",
&provider,
TxParameters::default(),
)
.await
.unwrap();
// 3. 创建合约实例
let contract_instance = CounterContract::new(contract_id, provider);
// 4. 测试初始计数是否为0
let initial_count = contract_instance.get_count().call().await.unwrap();
assert_eq!(initial_count.value, 0);
// 5. 测试增加计数
let increment_amount = 5u64;
contract_instance
.increment_count(increment_amount)
.call()
.await
.unwrap();
// 6. 验证计数已增加
let new_count = contract_instance.get_count().call().await.unwrap();
assert_eq!(new_count.value, increment_amount);
// 7. 测试重置计数
contract_instance
.reset_count()
.call()
.await
.unwrap();
// 8. 验证计数已重置为0
let reset_count = contract_instance.get_count().call().await.unwrap();
assert_eq!(reset_count.value, 0);
}
这个完整示例展示了:
- 如何设置测试环境
- 如何部署合约
- 如何与合约交互
- 如何验证合约状态变化
- 完整的测试流程
测试流程包括:
- 初始状态验证
- 执行合约方法
- 验证状态变化
- 清理测试环境