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提供以下测试辅助功能:

  1. setup_test_provider() - 快速设置测试用的燃料节点提供者
  2. 合约部署和交互的简化方法
  3. 交易参数和配置的默认值
  4. 测试环境自动清理

完整示例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);
}

这个完整示例展示了:

  1. 如何设置测试环境
  2. 如何部署合约
  3. 如何与合约交互
  4. 如何验证合约状态变化
  5. 完整的测试流程

测试流程包括:

  • 初始状态验证
  • 执行合约方法
  • 验证状态变化
  • 清理测试环境

回到顶部