(测试)创建对象 - 归属对象、共享对象、系统对象
在许多情况下,当调用被测试的函数时,你还需要传递归属对象和共享对象。但是我们如何获取这些对象呢?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);