介绍

在本系列文章的第一部分中,我们探讨了如何设置 CosmWasm 环境和 CosmWasm 合约的体系结构。 第二部分描述了设置项目的过程。
在第三部分中,我们讨论了主要业务逻辑以及用于在状态内计算和存储值的函数。 在本系列的第四部分也是最后一期中,我们将应用迄今为止学到的知识,执行单元和集成测试。 此外,我们将尝试一些函数来评估我们对整个过程的理解。

本系列中还有:
在 Cudos 网络上构建智能合约: 第 1 部分:准备第 2 部分:设置项目第 3 部分:主要业务逻辑

测试

Rust 提供了一个出色的功能,您可以在其中执行项目中的所有单元和集成测试。 这样,您就不需要设置另一个环境来进行测试。

#[cfg(test)]
模组测试 {
使用超级::*;
use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info};
use cosmwasm_std::{coins, StdError};
…..
}

  • 使用super::* 将导入此项目中使用的所有库
  • 使用cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}: 在这里,您将获得 deps、env 和测试所需的信息的模拟
  • 让我们直接进入测试

do_instantiate

一个。首先,创建一个将为我们成功部署合约的函数,因此您需要一个 可以为您部署合约的函数do_instantiate。

B. 参数:

  • deps:deps的可变对象,因此您可以访问存储,数量和薄荷
  • 添加者:您向谁分配初始余额
  • 金额:CW20代币的金额
  • 所有者:合同的所有者,并充当minter。 Minter仅负责将CW20代币铸造到其他地址。

C. 这里你需要一个 实例化Msg。

D.之后,您需要模拟将实例化合约的调用方,因此,请使用
mock_info,
您将所有者作为第一个参数。 如果您需要传递一些原生硬币,则必须插入一系列
硬币
作为第二个参数。

E.我使用mock_env

来模拟区块链信息,如高度,时间等。

F.我只是调用包含所有参数的 实例化 函数。

G.我断言响应长度为 0,因为 Response::d efault() 将给出零长度响应对象

H. 致电 query_token_info() 以确认合同上的数据存储。

I. 致电 getBalance() 以检查收件人是否获得初始余额。

J.致电 query_minter 以验证合同的所有者是否为中间人。

fn do_instantiate(
mut deps: DepsMut,
addr: &str,
金额: Uint128,
所有者: &str,
) – > TokenInfoResponse {
let instantiate_msg = InstantiateMsg {
名称:” 自动发电机组”.to_string(),
符号:” AUTO”.to_string(),
小数点: 3,
initial_balances: vec![Cw20Coin {
地址: addr.to_string(),

}],
};
let info = mock_info(owner, &[]);
let env = mock_env();
let res = instantiate(deps.branch(), env, info, instantiate_msg).unwrap();
assert_eq!(0, res.messages.len());

let meta = query_token_info(deps.as_ref()).unwrap();
assert_eq!(

TokenInfoResponse {
名称:” 自动发电机组”.to_string(),
符号:” AUTO”.to_string(),
小数点: 3,
total_supply:金额,
}
);
assert_eq!(get_balance(deps.as_ref(),地址),金额;
assert_eq!(query_minter(deps.as_ref()).unwrap(), 所有者);

}

Can_mint_by_minter

答:can_mint_by_minter测试用例确保只有minter才能将新代币铸造到其他地址。

B.让我们直接进入测试用例。

C. 要将任何函数标记为 rust 中的测试用例,您需要在该函数之上添加# [test]

D.通常,开发人员将与给定函数相关的所有正面和负面测试用例写入相同的测试用例。 因此,您必须使用注释(//)来隔离测试用例。

E.首先,您必须模拟deps对象,因为它包含区块链提供的存储,API和查询器;这是使用mock_depenndencies()

完成的

F.然后为 创建了一些变量

我。 收件人: 谁将获得代币作为初始余额的一部分

第二。 量:接收者作为初始余额的一部分收到的代币数量

第三。 所有者:部署合同并成为minter的地址

四。 胜利者: 所有者将向其铸造代币的地址

v. 奖品: 所有者将向获胜者铸造的CW20代币数量

G.第一个测试案例: 所有者成功将代币铸造给获胜者

我。 自 调用 Mint 函数,您需要创建一个 ExecuteMsg::Mint 对象。

ii. mock_info 将呼叫者嘲笑为 所有者 地址。

第三. mock_env 模拟区块链

四。 使用execute 方法运行在第一步中创建的executeMsg,并在收到 None 时取消包装返回死机

v. 使用 getBalance() 检查获胜者的余额。 如果余额等于奖品,则我们的Mint函数工作正常。

H.第二个测试案例: 其他人不能铸造

我。 自 调用 Mint 函数,您需要创建一个 ExecuteMsg::Mint 对象。

第二. mock_info 嘲笑其他人的地址。 为此,请使用 “其他任何人” 作为调用方

第三。 mock_env 模拟区块链。

四。 使用execute 方法运行在第一步中创建的executeMsg,并执行unwrap_err返回错误消息

v. 断言从函数“收缩错误:未经授权”收到的错误消息

I. 第三个测试用例: 将错误作为传递零作为量抛出

我。 自 调用Mint函数,您需要创建一个金额为零ExecuteMsg::Mint对象。

第二。 mock_info 所有者 模拟为呼叫者

第三。模拟区块链的mock_env

四。 使用execute 方法运行在第一步中创建的executeMsg,并执行unwrap_err返回错误消息

v. 断言从函数ContractError::InvalidZeroAmount收到的错误消息

#[test]
fn can_mint_by_minter() {
let mut deps = mock_dependencies(&[]);

let receive = String::from(”receiver”);
let amount = Uint128::new(11223344);
let owner = String::from(”asmodat”);
do_instantiate(deps.as_mut(),&收件人,金额和所有者);
让赢家 = 字符串::来自(”幸运”);
let prize = Uint128::new(222_222_222);
let msg = ExecuteMsg::Mint {
收件人: winner.clone(),
金额:奖品,
};

成功铸造代币以由所有者获胜者
let info = mock_info(owner.as_ref(), &[]);
let env = mock_env();
let res = execute(deps.as_mut(), env, info, msg).unwrap();

assert_eq!(0, res.messages.len());
assert_eq!(get_balance(deps.as_ref(),收件人),金额;
assert_eq!(get_balance(deps.as_ref(), winner.clone()), 奖品);

其他人不能铸造
let msg = ExecuteMsg::Mint {
收件人: 字符串::来自(”幸运”),
数量: Uint128:::新(222),
};
let info = mock_info(”any else”, &[]);
let env = mock_env();
let err = execute(deps.as_mut(), env, info, msg).unwrap_err();
assert_eq!(err, ContractError::Unauthorized {});

抛出错误作为传递零作为量
let msg = ExecuteMsg::Mint {
收件人: winner.clone(),
金额: Uint128::零(),
};
let info = mock_info(owner.as_ref(), &[]);
let env = mock_env();
let err = execute(deps.as_mut(), env, info, msg).unwrap_err();
assert_eq!(err, ContractError::InvalidZeroAmount {});
}

作业

之后,我希望你们尝试通过上面的代码和CW-plus作为示例来创建一些函数:

  • 分发回复()
  • 向所有利益相关者分配奖励
  • 奖励按天计算
  • 一旦用户调用此功能,奖励就会分发给每个利益相关者
  • 只有 minter 地址才能调用此函数
  • 撤回回报()
  • 呼叫者可以撤回其奖励,而不是赌注。
  • 股份和返还(账户):
  • 显示给定帐户的赌注和奖励
  • 总收入:
  • 显示总投注额。

你现在能做什么?

您可以通过以下链接加入我们 的激励测试网Project Artemis, 立即参与其中:

值得注意的是,您将根据作为测试网的一部分完成的任务 获得奖励

附言:如果您已经 购买了CUDOS代币,您可以通过 将它们押注在我们的平台上 来保护网络,从而充分利用它们,并作为回报获得奖励。

关于库多斯

Cudos网络是第1层区块链和第2层计算和oracle网络,旨在确保分散,无许可地访问大规模的高性能计算。 它支持将计算资源扩展到数十万个节点。 一旦桥接到以太坊、Algorand、Polkadot和Cosmos上,Cudos将在所有桥接区块链上实现可扩展的计算和第二层预言机。

了解更多信息:
网站, , 电报, 尤图布, 不和, 中等