Appearance
使用 Blueprint 编写测试
概述
测试工具包(通常是 sandbox)已经包含在名为 Blueprint 的 TypeScript SDK 中。您可以通过两个步骤创建演示项目并运行默认测试:
创建一个新的 Blueprint 项目:
bashnpm create ton@latest MyProject
运行测试:
bashcd MyProject npx blueprint test
结果将在终端窗口中看到相应的输出:
bash
% npx blueprint test
> MyProject@0.0.1 test
> jest
PASS tests/Main.spec.ts
Main
✓ should deploy (127 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.224 s, estimated 2 s
Ran all test suites.
基本用法
智能合约的测试可以覆盖安全性、优化 gas 消耗以及检查边界情况。在 Blueprint 中编写测试(基于 Sandbox)通过定义合约的任意操作并将其结果与预期结果进行比较,例如:
typescript
it('should execute with success', async () => { // 测试用例的描述
const res = await main.sendMessage(sender.getSender(), toNano('0.05')); // 执行合约 main 的操作并将结果保存在 res 中
expect(res.transactions).toHaveTransaction({ // 使用 expect() 函数配置预期结果
from: main.address, // 设置我们要测试的交易的预期发送者
success: true // 使用 matcher 属性 success 设置期望结果
});
printTransactionFees(res.transactions); // 打印详细的费用信息表
});
为复杂断言编写测试
创建测试的基本工作流程是:
- 使用
blockchain.openContract()
创建一个特定的包装合约实体。 - 描述您的合约应执行的操作,并将执行结果保存在
res
变量中。 - 使用
expect()
函数和 matchertoHaveTransaction()
验证属性。
toHaveTransaction
matcher 期望一个包含以下属性的对象,这些属性来自 FlatTransaction
类型:
名称 | 类型 | 描述 |
---|---|---|
from | Address? | 消息发送者的合约地址 |
on | Address | 消息目的地的合约地址(属性别名为 to ) |
value | bigint? | 消息中的 Toncoin 数量,以 nanotons 为单位 |
body | Cell | 定义为 Cell 的消息体 |
op | number? | 操作码是操作标识符号(通常为 TL-B 的 crc32)。预期在消息体的前 32 位。 |
success | boolean? | 自定义 Sandbox 标志,定义某个交易的结果状态。True - 如果计算和执行阶段都成功。否则 - False。 |
您可以省略不感兴趣的字段,也可以传递接受这些类型并返回布尔值的函数(true 表示通过)来检查例如数值范围、消息操作码等。请注意,如果字段是可选的(如 from?: Address
),则函数也需要接受可选类型。
从 Sandbox[https://github.com/ton-org/sandbox#test-a-transaction-with-matcher] 文档中了解 matcher 字段的完整列表。