账户存在性
验证账户是否存在或已被关闭。
断言账户存在
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_assert_account_exists() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();// This will pass - account existssvm.assert_account_exists(&alice.pubkey());}
断言账户已关闭
use litesvm_utils::{AssertionHelpers, LiteSVM, Pubkey};#[test]fn test_assert_account_closed() {let mut svm = LiteSVM::new();// A random pubkey that was never createdlet nonexistent = Pubkey::new_unique();// This will pass - account doesn't existsvm.assert_account_closed(&nonexistent);}
assert_account_closed 在账户不存在、lamport
余额为零或数据为空时通过。使用此方法验证关闭账户后的清理工作。
余额断言
验证 SOL 和代币余额。
断言 SOL 余额
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_assert_sol_balance() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();// Verify Alice has 10 SOLsvm.assert_sol_balance(&alice.pubkey(), 10 * LAMPORTS_PER_SOL);}
断言代币余额
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_assert_token_balance() {let mut svm = LiteSVM::new();let authority = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let user = svm.create_funded_account(5 * LAMPORTS_PER_SOL).unwrap();// Create mint and token accountlet mint = svm.create_token_mint(&authority, 9).unwrap();let user_ata = svm.create_associated_token_account(&mint.pubkey(), &user).unwrap();// Mint tokenssvm.mint_to(&mint.pubkey(), &user_ata, &authority, 5000).unwrap();// Verify balancesvm.assert_token_balance(&user_ata, 5000);}
断言铸币供应量
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_assert_mint_supply() {let mut svm = LiteSVM::new();let authority = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let user1 = svm.create_funded_account(5 * LAMPORTS_PER_SOL).unwrap();let user2 = svm.create_funded_account(5 * LAMPORTS_PER_SOL).unwrap();// Create mint (returns Keypair)let mint = svm.create_token_mint(&authority, 9).unwrap();// Create ATAs and mint tokenslet user1_ata = svm.create_associated_token_account(&mint.pubkey(), &user1).unwrap();let user2_ata = svm.create_associated_token_account(&mint.pubkey(), &user2).unwrap();svm.mint_to(&mint.pubkey(), &user1_ata, &authority, 1000).unwrap();svm.mint_to(&mint.pubkey(), &user2_ata, &authority, 2000).unwrap();// Verify total supplysvm.assert_mint_supply(&mint.pubkey(), 3000);}
账户属性
验证账户所有权和数据属性。
断言账户所有者
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_program};#[test]fn test_assert_account_owner() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();// Regular accounts are owned by the System Programsvm.assert_account_owner(&alice.pubkey(), &system_program::id());}
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_assert_token_account_owner() {let mut svm = LiteSVM::new();let authority = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let user = svm.create_funded_account(5 * LAMPORTS_PER_SOL).unwrap();let mint = svm.create_token_mint(&authority, 9).unwrap();let user_ata = svm.create_associated_token_account(&mint.pubkey(), &user).unwrap();// Token accounts are owned by the Token Programsvm.assert_account_owner(&user_ata, &spl_token::id());}
断言账户数据长度
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_assert_account_data_len() {let mut svm = LiteSVM::new();let authority = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let user = svm.create_funded_account(5 * LAMPORTS_PER_SOL).unwrap();let mint = svm.create_token_mint(&authority, 9).unwrap();let user_ata = svm.create_associated_token_account(&mint.pubkey(), &user).unwrap();// Token mint accounts are 82 bytessvm.assert_account_data_len(&mint.pubkey(), 82);// Token accounts are 165 bytessvm.assert_account_data_len(&user_ata, 165);}
常见账户大小:- 铸币账户:82 字节 - token account:165 字节 - 系统账户:0 字节(仅含 lamport)
完整示例
以下是一个演示多种断言的综合测试:
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_comprehensive_assertions() {let mut svm = LiteSVM::new();// Setuplet admin = svm.create_funded_account(100 * LAMPORTS_PER_SOL).unwrap();let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();// Verify initial SOL balancessvm.assert_sol_balance(&admin.pubkey(), 100 * LAMPORTS_PER_SOL);svm.assert_sol_balance(&alice.pubkey(), 10 * LAMPORTS_PER_SOL);svm.assert_sol_balance(&bob.pubkey(), 0);// Transfer SOL from Alice to Boblet transfer_ix = system_instruction::transfer(&alice.pubkey(),&bob.pubkey(),5 * LAMPORTS_PER_SOL,);svm.send_instruction(transfer_ix, &[&alice]).unwrap().assert_success();// Verify balances after transfer (Alice paid fees too)svm.assert_sol_balance(&bob.pubkey(), 5 * LAMPORTS_PER_SOL);// Create token infrastructure (mint returns Keypair, ATAs return Pubkey)let mint = svm.create_token_mint(&admin, 6).unwrap();let alice_ata = svm.create_associated_token_account(&mint.pubkey(), &alice).unwrap();let bob_ata = svm.create_associated_token_account(&mint.pubkey(), &bob).unwrap();// Verify account propertiessvm.assert_account_exists(&mint.pubkey());svm.assert_account_exists(&alice_ata);svm.assert_account_owner(&mint.pubkey(), &spl_token::id());svm.assert_account_data_len(&mint.pubkey(), 82);svm.assert_account_data_len(&alice_ata, 165);// Mint and verifysvm.mint_to(&mint.pubkey(), &alice_ata, &admin, 1_000_000).unwrap();svm.mint_to(&mint.pubkey(), &bob_ata, &admin, 500_000).unwrap();svm.assert_token_balance(&alice_ata, 1_000_000);svm.assert_token_balance(&bob_ata, 500_000);svm.assert_mint_supply(&mint.pubkey(), 1_500_000);println!("All assertions passed!");}
处理断言失败
当断言失败时,它将以描述性消息触发 panic:
// This will panic with a message like:// "Expected token balance 1000, but got 500"svm.assert_token_balance(&some_ata, 1000); // when balance is actually 500
断言旨在以清晰的错误消息快速失败。在测试中大量使用它们,以便尽早发现问题。
Is this page helpful?