(测试)创建对象 - 归属对象、共享对象、系统对象

在许多情况下,当调用被测试的函数时,你还需要传递归属对象和共享对象。但是我们如何获取这些对象呢?Sui VM 在执行交易时会自动完成这一操作, 但这是在测试中。test_scenario 提供了一些函数来帮助完成这一操作:

  • test_scenario::take_shared - 这个函数用于从交易的发送者那里获取一个共享对象。它接受一个 Scenario 对象作为参数,并返回共享对象。
let store = test_scenario::take_shared<BlackBooks>(&scenario);
  • test_scenario::take_from_sender - 这个函数用于从交易的发送者那里获取一个归属对象。它接受一个 Scenario 对象作为参数,并返回归属对象。
let cap = test_scenario::take_from_sender<StoreOwnerCap>(&scenario);

这里需要注意的是,如果你获取了共享对象,在结束场景之前需要将它们返回:

test_scenario::return_shared(store);

你可能还需要将 TxContext 传递给测试函数。这也可以通过 test_scenario 生成:

let ctx = &mut tx_context::new_from_hint(
    @0xC4AD,  // 发送者
    0u64,     // 提示, 用以生成 tx hash
    1,        // epoch
    0,        // epoch_timestamp_ms
    0,        // `ids_created` (通常为 `0`)
);

通过这种方式,你还可以配置从 tx_context 模块返回的不同数据:

  • sender:发送者
  • hint:用于生成交易哈希
  • epoch:纪元
  • epoch timestamp:纪元时间戳,以毫秒为单位
  • number of object ids already created so far:迄今为止已创建的对象 ID 数量。测试某些功能可能需要这个。

Clock,另一个系统对象,是一个共享对象,因此可以这样获取:

let clock = test::take_shared<Clock>(&test);