星航计划 - DeTask找活网 0基础开发入门到精通 (8)

第一版项目已经PR

DeTask 已经成功 pr 到官网

GitHub - movefuns/detask: detask

工程里的代码基本都在之前的教程里讲过了,本章再做一些补充。

关于编译

如果碰到莫名的报错:

lua 复制代码
Failed to build Move modules: Resolving package 'MoveStdlib'
Caused by:
    0: Unable to find package manifest at "./..\..\..\sui\crates\sui-framework\packages\move-stdlib"
    1: No such file or directory (os error 2).

可以尝试删除lock文件重新build

删掉这个文件

csharp 复制代码
Move.lock

智能合约的测试

测试概要

在编写Move智能合约代码的时候,往往需要编写测试代码以便于验证代码的正确性,由于合约是运行在链上的,所以先在本地测试尤其重要,初学者往往是写了一大段代码后直接发布到链上,然后运行发现出错了,但出错提示往往不是很详细,出现了卡壳现象。

为了避免这方面的问题,所以SUI提供了丰富的本地测试方案。

命令行方式

arduino 复制代码
sui move test 

有时候会很慢 可以尝试使用 --skip-fetch-latest-git-deps 来跳过一些检测加快一些编译速度和测试速度。

test标签

css 复制代码
#[test]
 fun test_begin(){
        debug::print(&utf8(b"test_begin start"));
 
        debug::print(&utf8(b"test_begin end"));
}

在test标签下的函数会在使用sui move test 命令时执行

正式发布到链上时不会启动,这个放心。

print函数是用来在命令行界面输出字符串的,如果模块多的话可以考虑这样的形式,让输出更加清晰

css 复制代码
        debug::print(&utf8(b"module: function name:test_begin start"));

testonly标签

testonly标签用于定义一些供test函数使用的函数和use模块

比如想测试一下初始化函数init可以这么写

kotlin 复制代码
#[test_only]
public fun init_for_testing(ctx: &mut TxContext) {
    init(ctx);
}

然后在其他测试函数实际调用

scss 复制代码
 #[test]
 fun test_new_petitem(){
     debug::print(&utf8(b"test_new_petitem start"));

     init_for_testing(nowctx);
}

测试文件形式

如果测试项目多可以集中将测试函数写入一个模块放入测试文件夹里

在detask项目中,我在detaskmv目录里新建了一个 tests目录

里面的move文件就是专门存放测试模块并将测试代码统一放到这个模块里,方便管理。

传输对象测试

本地测试能模拟很多场景,比如新建一个结构并传给一个用户。

我们先新建一个对象

kotlin 复制代码
 public fun new_petitem(name:string::String,no:u64,ctx: &mut TxContext):PetItem{
        PetItem{
            id:object::new(ctx),
            name,
            no
        }
    }

然后用测试函数尝试给与一个用户地址

rust 复制代码
#[test]
fun test_new_petitem(){
    let looker:address = @0xAABB;//用户地址,这里是测试代码,所以是乱写的
    let scenario:sui::test_scenario::Scenario = test_scenario::begin(looker);
 
    let nowctx : &mut TxContext = test_scenario::ctx(&mut scenario );//制作一个测试用的ctx
    let nowpet:PetItem  = new_petitem(name,23,nowctx);//建立了一个对象
    transfer::transfer(nowpet,looker);//传输对象
 
    test_scenario::end(scenario);
}

以上测试代码完整的模拟了一个对象建立和传输的过程。

好了,本系列0基础入门教程基本讲了一下大致的开发流程,以后,有机会的话,会根据大家的反馈,更加细致的编撰新的sui move 智能合约应用的开发。

感谢星航的各位伙伴们,让我们一起在未来的星际中启航!

Move语言学习交流QQ群: 79489587

Sui官方中文开发者电报群: t.me/sui_dev_cn

相关推荐
CertiK19 小时前
CertiK荣获以太坊基金会两项资助,领跑zkEVM形式化验证
web3·区块链·以太坊
Blossom.11820 小时前
Web3.0:互联网的去中心化未来
人工智能·驱动开发·深度学习·web3·去中心化·区块链·交互
QQ2740287561 天前
BlockMesh Ai项目 监控节点部署教程
运维·服务器·web3
2501_910227541 天前
web3 前端常见错误类型以及错误捕获处理
前端·web3
CertiK1 天前
Crowdfund Insider聚焦:CertiK联创顾荣辉解析Web3.0创新与安全平衡之术
安全·web3
QQ2740287562 天前
Kite AI 自动机器人部署教程
linux·运维·服务器·人工智能·机器人·web3
web4x4 天前
Web4X:站在Web4.0时代的起点,定义AI商业新生态
web3·aigc
拾忆-eleven5 天前
区块链+农业:从田间到餐桌的信任革命
区块链·智能合约
电报号dapp1195 天前
区块链钱包开发全解析:从架构设计到安全生态构建
安全·web3·去中心化·区块链·智能合约
猫头虎5 天前
5G-A来了!5G信号多个A带来哪些改变?
5g·机器人·web3·aigc·社交电子·能源·量子计算