솔라나 문서LiteSVMRust추가 크레이트litesvm-utils

어설션

계정 존재 여부

계정이 존재하는지 또는 닫혔는지 확인합니다.

계정 존재 어설션

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 exists
svm.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 created
let nonexistent = Pubkey::new_unique();
// This will pass - account doesn't exist
svm.assert_account_closed(&nonexistent);
}

assert_account_closed는 계정이 존재하지 않거나, lamport가 0이거나, 데이터가 비어 있을 때 통과합니다. 계정 닫기 후 정리를 검증하는 데 사용하세요.

잔액 어설션

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 SOL
svm.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 account
let mint = svm.create_token_mint(&authority, 9).unwrap();
let user_ata = svm.create_associated_token_account(&mint.pubkey(), &user).unwrap();
// Mint tokens
svm.mint_to(&mint.pubkey(), &user_ata, &authority, 5000).unwrap();
// Verify balance
svm.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 tokens
let 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 supply
svm.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 Program
svm.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 Program
svm.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 bytes
svm.assert_account_data_len(&mint.pubkey(), 82);
// Token accounts are 165 bytes
svm.assert_account_data_len(&user_ata, 165);
}

일반적인 계정 크기: - Mint Account: 82바이트 - token account: 165 바이트 - System Account: 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();
// Setup
let 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 balances
svm.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 Bob
let 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 properties
svm.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 verify
svm.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!");
}

어서션 실패 처리

어서션이 실패하면 설명적인 메시지와 함께 패닉이 발생합니다:

// 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?

목차

페이지 편집