Aptos Move单元测试调用timestamp报错求助:Failed to borrow global resource
在Move单元测试中调用
timestamp::now_seconds()报错的解决方法 问题场景
编写了如下Move单元测试代码:
#[test] fun get_seconds() { timestamp::now_seconds(); }
执行测试命令:
sudo aptos move test --package-dir sources
出现MISSING_DATA (code 4008)错误,提示无法从0x1地址借用全局资源CurrentTimeMicroseconds。
错误原因
Aptos的timestamp模块依赖的CurrentTimeMicroseconds全局资源,是链上环境中由Aptos框架在创世阶段部署初始化的。但单元测试运行在孤立的本地测试环境中,默认不会自动初始化这个全局资源,直接调用now_seconds()会因为找不到资源而报错。
解决方案
方案1:手动初始化时间资源
在测试函数中,先调用timestamp模块的初始化函数创建CurrentTimeMicroseconds资源(测试环境下允许模拟框架地址的权限):
#[test] fun get_seconds() { // 模拟框架地址初始化时间资源,参数为微秒级时间戳 timestamp::initialize(@aptos_framework, 1690000000000000); // 现在可以正常调用时间函数 let _ = timestamp::now_seconds(); }
方案2:封装时间逻辑并Mock测试
如果业务代码依赖时间获取,可封装一层逻辑,在测试中替换为固定值,避免直接依赖框架模块:
// 业务模块中封装时间获取函数 public fun get_current_seconds(): u64 { timestamp::now_seconds() } // 测试专用的Mock函数 #[test_only] public fun mock_get_current_seconds(): u64 { 1690000000 } // 测试用例 #[test] fun test_with_mock_time() { let _ = mock_get_current_seconds(); }
内容的提问来源于stack exchange,提问作者Gavin
相关产品推荐
相关产品推荐

