宠物商店demo实践2
上一节主要是运行pet-shop的例子,这一节中主要对pet-shop的例子结合业务场景进行智能合约的编写。包括领养宠物,并保存领养者合约地址,得到所有的领养者等。
参考区块链-以太坊学习笔记(四)-web3.js调用智能合约中所写的,可以在此工程的基础上进行修改如下:三步走
1、新建contracts/Adoption.sol
pragma solidity ^0.4.24;
contract Adoption {
address[16] public adopters; // 保存领养者的地址 下标是 0~15
// 领养宠物
function adopt(uint petId) public returns (uint) {
require(petId >= 0 && petId <= 15); // 确保id在数组长度内 assert()也可以
adopters[petId] = msg.sender; // 保存调用这地址,msg.sender 总是存放着当前函数的外部调用者的地址
return petId;
}
// 返回领养者
function getAdopters() public view returns (address[16]) {
return adopters;
}
}
2、在truffle develop编译一下compile,在./build/contracts文件中生成json文件
3、在migrations 添加1_initial_migration0.js,处理智能合约部署用
var Migrations = artifacts.require("./Adoption.sol");
module.exports = function(deployer) {
deployer.deploy(Migrations);
};
在test文件夹中新建测试用例:test\TestAdoption.sol
pragma solidity ^0.4.24;
import "truffle/Assert.sol"; // 引入的断言
import "truffle/DeployedAddresses.sol"; // 用来获取被测试合约的地址
import "../contracts/Adoption.sol"; // 被测试合约
contract TestAdoption {
/**
DeployedAddress.<contract name>();返回一个您能用来访问合约的地址
*/
Adoption adoption = Adoption(DeployedAddresses.Adoption());
/**
领养测试用例,返回宠物id
*/
function testUserCanAdoptPet() public {
uint returnedId = adoption.adopt(8);
uint expected = 8;
Assert.equal(returnedId, expected, "Adoption of pet ID 8 should be recorded.");
}
/**
宠物所有者测试用例
*/
function testGetAdopterAddressByPetId() public {
// 期望领养者的地址就是本合约地址,因为交易是由测试合约发起交易,
address expected = this;
address adopter = adoption.adopters(8);
Assert.equal(adopter, expected, "Owner of pet ID 8 should be recorded.");
}
/**
所有领养者测试用例
*/
function testGetAdopterAddressByPetIdInArray() public {
// 领养者的地址就是本合约地址
address expected = this;
address[16] memory adopters = adoption.getAdopters();
Assert.equal(adopters[8], expected, "Owner of pet ID 8 should be recorded.");
}
}
注:所有的测试合约必须以Test开头。
参考:
1、https://truffleframework.com/docs/getting_started/solidity-tests Assert.sol及DeployedAddresses.sol的介绍
2、https://learnblockchain.cn/2018/01/12/first-dapp/
后面的学习章节中将在用户访问的界面连接智能合约实现业务逻辑的操作。