Skip to content

Commit e13d20d

Browse files
committed
i18n: sync and fix Testing with Mollusk course for Simplified Chinese
1 parent d3e3d34 commit e13d20d

File tree

2 files changed

+69
-125
lines changed
  • src/app/content/courses/testing-with-mollusk

2 files changed

+69
-125
lines changed

src/app/content/courses/testing-with-mollusk/advanced-functionalities/zh-CN.mdx

Lines changed: 56 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ fn test() {
6767

6868
Mollusk 的 token program 助手显著简化了涉及 SPL 代币的测试场景。`mollusk-svm-programs-token` crate 提供了对 `Token``Token2022``Associated Token` 程序的预配置支持。
6969

70+
### 程序账户
71+
7072
在包含 token helper crate 后,添加您的测试所需的特定 token 程序:
7173

7274
```rust
@@ -103,108 +105,73 @@ let (associated_token_program, associated_token_program_account) =
103105
mollusk_svm_programs_token::associated_token::keyed_account();
104106
```
105107

106-
这些助手确保与代币相关的测试能够访问正确的程序账户并具有适当的配置,从而无需手动设置程序即可全面测试代币操作。
108+
这些助手确保代币相关测试能够访问正确的程序账户并进行适当配置,从而无需手动设置程序即可全面测试代币操作。
107109

108-
如果我们想从 token program 中创建已初始化的 State 账户,我们需要使用 Account 方法创建它们,并将其加载到 Mollusk 实例的账户结构中。
110+
### 状态账户
109111

110-
手动创建已初始化的 token account 涉及大量的样板代码,用于序列化账户数据和计算 rent 免除。以下是简化此过程的辅助函数:
112+
在测试过程中,我们可能需要一个已经初始化的 `Mint``Token``Associated Token` 账户。幸运的是,Mollusk 为我们提供了一些方便的助手。
111113

112-
```rust
113-
use spl_token::{state::{Mint, Account as TokenAccount, AccountState}, ID as token};
114-
use spl_associated_token_account::get_associated_token_address_with_program_id;
115-
116-
// Create a Keyed Account for a Mint with default data
117-
#[allow(dead_code)]
118-
pub fn keyed_account_for_mint_default(
119-
mollusk: &Mollusk,
120-
authority: &Pubkey,
121-
decimals: u8,
122-
pubkey: Option<Pubkey>,
123-
token_program: Option<Pubkey>,
124-
) -> (Pubkey, Account) {
125-
let mint_data = Mint {
126-
mint_authority: Some(*authority).into(),
127-
supply: 0,
128-
decimals,
129-
is_initialized: true,
130-
freeze_authority: None.into(),
131-
};
114+
要创建一个`Mint`账户,我们可以像这样使用`create_account_for_mint()`函数:
132115

133-
let mut data = vec![0u8; Mint::LEN];
134-
Mint::pack(mint_data, &mut data).unwrap();
116+
```rust
117+
use spl_token::state::Mint;
118+
use mollusk_svm_programs_token::token::create_account_for_mint;
119+
120+
let mint_data = Mint {
121+
mint_authority: Pubkey::new_unique(),
122+
supply: 10_000_000_000,
123+
decimals: 6,
124+
is_initialized: true,
125+
freeze_authority: None,
126+
};
135127

136-
let account = Account {
137-
lamports: mollusk.sysvars.rent.minimum_balance(Mint::LEN),
138-
data,
139-
owner: token_program.unwrap_or(token::ID),
140-
executable: false,
141-
rent_epoch: 0,
142-
};
128+
let mint_account = create_account_for_mint(mint_data)
129+
```
143130

144-
(pubkey.unwrap_or(Pubkey::new_unique()), account)
145-
}
131+
要创建一个`Token`账户,我们可以像这样使用`create_account_for_token_account()`函数:
146132

147-
// Create a Keyed Account for a Token Account with default data
148-
#[allow(dead_code)]
149-
pub fn keyed_account_for_token_account_default(
150-
mollusk: &Mollusk,
151-
mint: &Pubkey,
152-
owner: &Pubkey,
153-
amount: u64,
154-
pubkey: Option<Pubkey>,
155-
token_program: Option<Pubkey>,
156-
) -> (Pubkey, Account) {
157-
let account_data = TokenAccount {
158-
mint: *mint,
159-
owner: *owner,
160-
amount,
161-
delegate: None.into(),
162-
state: AccountState::Initialized,
163-
is_native: None.into(),
164-
delegated_amount: 0,
165-
close_authority: None.into(),
166-
};
133+
```rust
134+
use spl_token::state::{TokenAccount, AccountState};
135+
use mollusk_svm_programs_token::token::create_account_for_token_account;
136+
137+
let token_data = TokenAccount {
138+
mint: Pubkey::new_unique(),
139+
owner: Pubkey::new_unique(),
140+
amount: 1_000_000,
141+
delegate: None,
142+
state: AccountState::Initialized,
143+
is_native: None,
144+
delegated_amount: 0,
145+
close_authority: None,
146+
};
167147

168-
let mut data = vec![0u8; TokenAccount::LEN];
169-
TokenAccount::pack(account_data, &mut data).unwrap();
148+
let token_account = create_account_for_token_account(token_data)
149+
```
170150

171-
let account = Account {
172-
lamports: mollusk.sysvars.rent.minimum_balance(TokenAccount::LEN),
173-
data,
174-
owner: token_program.unwrap_or(token::ID),
175-
executable: false,
176-
rent_epoch: 0,
177-
};
151+
> 注意:这些示例适用于SPL-Token程序。如果您想创建由Token2022程序拥有的`Mint``Token`账户,只需使用`mollusk_svm_programs_token::token2022::...`
178152
179-
(pubkey.unwrap_or(Pubkey::new_unique()), account)
180-
}
153+
要创建一个`Associated Token`账户,我们可以像这样使用`create_account_for_associated_token_account()`函数:
181154

182-
// Create a Keyed Account for an Associated Token Account with default data
183-
#[allow(dead_code)]
184-
pub fn keyed_account_for_associated_token_account_default(
185-
mollusk: &Mollusk,
186-
mint: &Pubkey,
187-
owner: &Pubkey,
188-
amount: u64,
189-
token_program: Option<Pubkey>,
190-
) -> (Pubkey, Account) {
191-
let associated_token_address = get_associated_token_address_with_program_id(
192-
owner,
193-
mint,
194-
&token_program.unwrap_or(token::ID),
195-
);
155+
```rust
156+
use spl_token::state::{TokenAccount, AccountState};
157+
use mollusk_svm_programs_token::associated_token::pub fn create_account_for_associated_token_account;
158+
159+
let token_data = TokenAccount {
160+
mint: Pubkey::new_unique(),
161+
owner: Pubkey::new_unique(),
162+
amount: 1_000_000,
163+
delegate: None,
164+
state: AccountState::Initialized,
165+
is_native: None,
166+
delegated_amount: 0,
167+
close_authority: None,
168+
};
196169

197-
keyed_account_for_token_account_default(
198-
mollusk,
199-
mint,
200-
owner,
201-
amount,
202-
Some(associated_token_address),
203-
Some(token_program.unwrap_or(token::ID)),
204-
)
205-
}
170+
let associated_token_account = create_account_for_associated_token_account(token_data)
206171
```
207172

173+
> 注意:此示例适用于SPL-Token程序。如果您想创建由Token2022程序拥有的`Associated Token`账户,只需使用`create_account_for_associated_token_2022_account`函数。
174+
208175
<ArticleSection name="基准测试计算单元" id="benchmarking-compute-units" level="h2" />
209176

210177
Mollusk 包含一个专用的计算单元基准测试系统,可以精确测量和跟踪程序的计算效率。`MolluskComputeUnitBencher` 提供了一个简化的 API,用于创建全面的基准测试,监控不同指令场景下的计算单元消耗。
@@ -458,7 +425,7 @@ use solana_sdk::feature_set::FeatureSet;
458425
// Enable all features (latest functionality)
459426
mollusk.set_feature_set(FeatureSet::all_enabled());
460427

461-
// Use default feature set (production-like environment)
428+
// All features disabled
462429
mollusk.set_feature_set(FeatureSet::default());
463430
```
464431

src/app/content/courses/testing-with-mollusk/mollusk-101/zh-CN.mdx

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { ArticleSection } from "../../../../components/ArticleSection/ArticleSec
22

33
# Mollusk 101
44

5+
![Mollusk 101](/graphics/course-banners/testing-with-mollusk.png)
6+
57
高效测试 Solana 程序需要一个能够平衡速度、精确性和洞察力的框架。在开发复杂的程序逻辑时,您需要一个既能快速迭代又不牺牲测试边界情况或准确测量性能能力的环境。
68

79
理想的 Solana 测试框架应具备以下三个基本功能:
@@ -30,34 +32,28 @@ Mollusk 的测试工具支持全面的配置选项,包括计算预算调整、
3032
将主 Mollusk crate 添加到您的项目中:
3133

3234
```
33-
cargo add mollusk-svm
35+
cargo add mollusk-svm --dev
3436
```
3537

3638
根据需要包含特定程序的辅助工具:
3739

3840
```
39-
cargo add mollusk-svm-programs-memo mollusk-svm-programs-token
41+
cargo add mollusk-svm-programs-memo mollusk-svm-programs-token --dev
4042
```
4143

4244
这些额外的 crate 提供了预配置的辅助工具,用于标准的 Solana 程序,减少了样板代码并简化了涉及代币操作或备忘指令的常见测试场景的设置。
4345

46+
> `cargo add <crate-name> --dev` 中的 `--dev` 标志用于通过将它们添加到 `[dev-dependencies]` 部分中来保持程序二进制文件的轻量化。
47+
> 此配置确保测试工具不会增加程序的部署大小,同时在开发过程中提供对所有必要的 Solana 类型和辅助函数的访问。
48+
4449
### 额外依赖
4550

4651
一些 Solana crate 通过提供必要的类型和工具来增强测试体验:
4752

4853
```
49-
cargo add solana-precompiles solana-account solana-pubkey solana-feature-set solana-program solana-sdk
50-
```
51-
52-
由于这些依赖项仅在测试中需要,因此可以通过将它们添加到 `[dev-dependencies]` 部分的 `Cargo.toml` 中,保持程序二进制文件的轻量化:
53-
54-
```
55-
[dev-dependencies]
56-
mollusk-svm = "0.4.0"
54+
cargo add solana-precompiles solana-account solana-pubkey solana-feature-set solana-program solana-sdk --dev
5755
```
5856

59-
> 此配置确保测试工具不会增加程序的部署大小,同时在开发过程中提供对所有必要的 Solana 类型和辅助功能的访问。
60-
6157
<ArticleSection name="Mollusk 基础" id="mollusk-basics" level="h2" />
6258

6359
首先声明 `program_id` 并创建一个 `Mollusk` 实例,使用您在程序中使用的地址,以便正确调用并避免在测试期间抛出 "ProgramMismatch" 错误,以及构建程序的路径,如下所示:
@@ -88,6 +84,7 @@ fn test() {
8884
```
8985

9086
在测试中,我们可以使用以下四种主要 API 方法之一:
87+
9188
- `process_instruction`:处理指令并返回结果。
9289
- `process_and_validate_instruction`:处理指令并对结果执行一系列检查,如果任何检查失败则触发 panic。
9390
- `process_instruction_chain`:处理一系列指令并返回结果。
@@ -118,8 +115,7 @@ let payer = Pubkey::new_unique();
118115
let payer_account = Account::new(100_000_000, 0, &system_program::id());
119116

120117
// Uninitialized account with no lamports
121-
let uninitialized_account = Pubkey::new_unique();
122-
let uninitialized_account_account = Account::new(0, 0, &system_program::id());
118+
let default_account = Account::default();
123119
```
124120

125121
对于包含数据的 `ProgramAccounts`,您有两种构建方法:
@@ -145,24 +141,6 @@ let program_account_account = Account {
145141
};
146142
```
147143

148-
或者使用 `AccountSharedData`
149-
150-
```rust
151-
use solana_sdk::account::AccountSharedData;
152-
153-
let data = vec![
154-
// Your serialized account data
155-
];
156-
let lamports = mollusk
157-
.sysvars
158-
.rent
159-
.minimum_balance(data.len());
160-
161-
let program_account = Pubkey::new_unique();
162-
let mut program_account_account = AccountSharedData::new(lamports, data.len(), &ID);
163-
program_account_account.set_data_from_slice(&data);
164-
```
165-
166144
创建账户后,将它们编译成 Mollusk 所需的格式:
167145

168146
```rust
@@ -172,8 +150,6 @@ let accounts = [
172150
];
173151
```
174152

175-
> 使用 AccountSharedData 时,请记得调用 `.into()` 将其转换为 Mollusk 执行所需的 Account 类型,如下所示:`program_account_account.into()`
176-
177153
### 指令
178154

179155
一旦了解了三个基本组件,为 Mollusk 测试创建指令就变得简单了:标识您的程序的 `program_id`,包含区分符和参数的 `instruction_data`,以及指定涉及账户及其权限的账户元数据。
@@ -209,13 +185,14 @@ pub fn get_anchor_discriminator_from_name(name: &str) -> [u8; 8] {
209185
let result = hasher.finalize();
210186

211187
[
212-
result[0], result[1], result[2], result[3],
188+
result[0], result[1], result[2], result[3],
213189
result[4], result[5], result[6], result[7],
214190
]
215191
}
216192
```
217193

218194
对于 `AccountMeta` 结构体,我们需要根据账户权限使用适当的构造函数:
195+
219196
- `AccountMeta::new(pubkey, is_signer)`:用于可变账户
220197
- `AccountMeta::new_readonly(pubkey, is_signer)`:用于只读账户
221198

@@ -269,7 +246,7 @@ mollusk.process_and_validate_instruction(
269246
mollusk.process_instruction_chain(
270247
&[
271248
(&instruction, &accounts),
272-
(&instruction_2, &accounts_2)
249+
(&instruction_2, &accounts_2)
273250
]
274251
);
275252
```

0 commit comments

Comments
 (0)