要使用 Rust 创建你自己的测试模板,请在脚本项目目录中按照以下步骤操作 cargo-generate
:
cargo-generate
: cargo install cargo-generate --locked
cargo generate --init fuellabs/sway templates/sway-test-rs --name sway-store
我们之前在 Sway 教程的介绍中涵盖了导入和设置 predicate,特别是在 Rust 测试部分 。如果你还没有查看那个部分,我强烈建议你先去看看。
复制并粘贴下面的 Rust 测试代码:
use fuels::{
prelude::*,
crypto::SecretKey
};
abigen!(Script(
name = "MultiSigScript",
abi = "./out/debug/predicate-script-logging-abi.json"
));
#[tokio::test]
async fn script_logs() -> Result<()> {
// WALLET
let private_key: SecretKey =
"0xc2620849458064e8f1eb2bc4c459f473695b443ac3134c82ddd4fd992bd138fd"
.parse()
.unwrap();
let mut wallet: WalletUnlocked = WalletUnlocked::new_from_private_key(private_key, None);
// TOKENS
let all_coins = [&wallet]
.iter()
.flat_map(|wallet| {
setup_single_asset_coins(wallet.address(), AssetId::default(), 10, 1_000_000)
})
.collect::<Vec<_>>();
// PROVIDER
let node_config = NodeConfig::default();
let provider = setup_test_provider(all_coins, vec![], Some(node_config), None).await.unwrap();
[&mut wallet]
.iter_mut()
.for_each(|wallet| {
wallet.set_provider(provider.clone());
});
let bin_path = "./out/debug/predicate-script-logging.bin";
let instance = MultiSigScript::new(wallet.clone(), bin_path);
let response = instance.main().call().await?;
let logs = response.decode_logs();
println!("{:?}", logs);
Ok(())
// Now you have an instance of your contract you can use to test each function
}
现在,我想引起你注意的是代码的特定部分:
let bin_path = "./out/debug/predicate-script-logging.bin";
let instance = MultiSigScript::new(wallet.clone(), bin_path);
let response = instance.main().call().await?;
let logs = response.decode_logs();
println!("{:?}", logs);
我们现在可以调用 decode_logs
来提取我们的秘密数字,这是我们在使用 predicates 进行测试时无法做到的。
要使测试期间的打印输出出现在控制台中,你可以使用 nocapture
标志。
cargo test -- --nocapture
在开发更复杂的 predicates 时,记住这种方法是至关重要的,特别是当调试变得越来越具有挑战性时。