星航计划 - 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 天前
Foundry Cheatcode 详解:prank、warp、deal、expectRevert、expectEmit
后端·web3·solidity
明月_清风1 天前
Foundry Fuzz Testing:让测试自动寻找 Solidity Bug
后端·web3·solidity
明月_清风2 天前
Foundry Web3 测试框架入门:从 0 开始写 Solidity 测试
后端·web3·solidity
Web3李李2 天前
短剧+Web3:破解行业获客留客难题,打造零门槛用户增长闭环
web3·去中心化·区块链·软件开发·dapp开发·web3短剧·web3项目开发
磐链科技5 天前
交易所开发核心:钱包提现引擎的设计——从风控拦截、多级审批到自动广播上链
web3·区块链
磐链科技7 天前
Web3钱包开发中的交易风控体系:模拟执行、沙盒隔离与授权拦截
web3·区块链
磐链科技9 天前
Web3钱包开发扩展比特币生态:BRC20与Runes协议的集成实践
web3
磐链科技10 天前
Web3钱包安全架构设计:抵御攻击与防护策略
安全·web3·安全架构
mykj155113 天前
Web3开发系统不是炒币,是互联网的“对账本”逻辑
web3·区块链·rwa·钱包区块链系统开发
MartinYeung514 天前
[论文学习]智能合约不变式防御网络犯罪
网络·学习·智能合约