Skip to content

使用 Blueprint 编写测试

概述

测试工具包(通常是 sandbox)已经包含在名为 Blueprint 的 TypeScript SDK 中。您可以通过两个步骤创建演示项目并运行默认测试:

  1. 创建一个新的 Blueprint 项目:

    bash
    npm create ton@latest MyProject
  2. 运行测试:

    bash
    cd 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);                                  // 打印详细的费用信息表
});

为复杂断言编写测试

创建测试的基本工作流程是:

  1. 使用 blockchain.openContract() 创建一个特定的包装合约实体。
  2. 描述您的合约应执行的操作,并将执行结果保存在 res 变量中。
  3. 使用 expect() 函数和 matcher toHaveTransaction() 验证属性。

toHaveTransaction matcher 期望一个包含以下属性的对象,这些属性来自 FlatTransaction 类型:

名称类型描述
fromAddress?消息发送者的合约地址
onAddress消息目的地的合约地址(属性别名为 to
valuebigint?消息中的 Toncoin 数量,以 nanotons 为单位
bodyCell定义为 Cell 的消息体
opnumber?操作码是操作标识符号(通常为 TL-B 的 crc32)。预期在消息体的前 32 位。
successboolean?自定义 Sandbox 标志,定义某个交易的结果状态。True - 如果计算和执行阶段都成功。否则 - False。

您可以省略不感兴趣的字段,也可以传递接受这些类型并返回布尔值的函数(true 表示通过)来检查例如数值范围、消息操作码等。请注意,如果字段是可选的(如 from?: Address),则函数也需要接受可选类型。

从 Sandbox[https://github.com/ton-org/sandbox#test-a-transaction-with-matcher] 文档中了解 matcher 字段的完整列表。