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

相关推荐
Footprint_Analytics18 小时前
Web3 游戏周报(11.03 - 11.09)
游戏·web3
Koi慢热19 小时前
WEB3.0介绍
web3
程序员 jet_qi2 天前
区块链应用第1讲:基于区块链的智慧货运平台
区块链·智能合约·数字身份·did·货运平台·可验性证明·vc
欧科云链3 天前
OKG Research:用户意图驱动的Web3应用变革
web3
bigbig猩猩3 天前
深入理解智能合约 ABI
区块链·智能合约
zhuqiyua4 天前
TVM OpcodeTable c++
c++·区块链·智能合约·ton
聪明的墨菲特i4 天前
Django前后端分离基本流程
后端·python·django·web3
Antg4 天前
[基础] 003 使用github提交作业
web3·智能合约·move·sui
mushangqiujin4 天前
ctfshow web入门黑盒测试web380-384
web3
Footprint_Analytics5 天前
Footprint Analytics 助力 Sei 游戏生态增长
游戏·web3·区块链