星航计划 - 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

相关推荐
天晟科技1 小时前
Web3技术在元宇宙中的应用:从区块链到智能合约
web3·区块链·智能合约
NFT_Research14 小时前
NFTScan | 11.18~11.24 NFT 市场热点汇总
web3·区块链·nft
程序猿阿伟3 天前
《C++智能合约与区块链底层交互全解析:构建坚实的去中心化应用桥梁》
c++·区块链·智能合约
安静的街道3 天前
web3系列——重入攻击(solidity)
web3
mirrornan4 天前
什么是Web3D?有何优势?有哪些应用场景?
3d·web3·webgl·3d模型
Roun34 天前
Web3和区块链如何促进数据透明与隐私保护的平衡
web3·区块链·隐私保护
dingzd954 天前
Web3的核心技术:区块链如何确保信息安全与共享
web3·去中心化·区块链
清 晨4 天前
Web3与智能合约:区块链技术下的数字信任体系
web3·区块链·智能合约
脆皮泡泡4 天前
Ultiverse 和web3新玩法?AI和GameFi的结合是怎样
人工智能·web3
CertiK4 天前
Web3.0安全开发实践:Clarity最佳实践总结
web3·区块链·clarity