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

相关推荐
nomi-糯米7 小时前
Fisco Bcos 2.11.0配置console控制台2.10.0及部署调用智能合约
分布式·网络安全·区块链·智能合约·分布式账本
6230_16 小时前
git使用“保姆级”教程1——简介及配置项设置
前端·git·学习·html·web3·学习方法·改行学it
小妖别跑1 天前
PDA(程序派生地址,Program Derived Address),为什么有这个地址,而不是直接指定地址
前端·智能合约
zhuqiyua2 天前
TVM和EVM的比较
区块链·智能合约·ton
清 晨2 天前
开放的数据时代:Web3和个人隐私的未来
web3·去中心化·智能合约·隐私保护
dingzd952 天前
数字世界的新秩序:探索Web3的前景
web3·去中心化·智能合约
加密社3 天前
【加密社】深入理解TON智能合约 (FunC语法)
智能合约
nina_LeXin3 天前
Mina protocol - 体验教程
web3·区块链·密码学·零知识证明
Roun34 天前
Web3与AI的交汇点:打造未来智能化去中心化应用
人工智能·web3·去中心化
Roun34 天前
科技前沿:Web3与物联网的智能连接
科技·物联网·web3·去中心化