如何使用truffle测试智能合约以及常见报错信息
上面我们知道可以通过deployed获取以及部署到链上的合约,那么如何不通过第二步部署合约直接在测试脚本里测试合约呢,就可以通过new来创建一个合约实例。我们定义一个let 变量,然后通过before来在所有的it测试之间将合约拉下来,保存到helloWorld变量中,后续的it测试就直接使用这个实例。我们可以发现地址不一样了,说明我们new出来的是个新的实例对象,那由于我们是不同的对象,我们的数
1.安装
-
下载node.js 利用npm 下载truffle :
npm install -g truffle
-
安装本地Ganache
进入官网:https://trufflesuite.com/ganache/,我们下载对应的电脑系统的版本,下载安装包后,直接安装即可

按照进入ganache有两个选项 
我们选择定制启动,可以配置我们的一个暴露端口,网络ID等等 
2.部署
1.新建一个目录,打开终端输入 truffle init
2.接下来我们来将下面的HelloWorld合约放到我们工程中
pragma solidity ^0.5.2;
contract HelloWorld {
string name;
event setEvent (
string name
);
constructor() public {
name = "Hello, World!";
}
function get() public view returns (string memory) {
return name;
}
function set(string memory n) public {
name = n;
emit setEvent(n);
}
}
3.编写部署脚本(多个迁移文件,开头必须加数字,表明迁移顺序)
const Test = artifacts.require("Test");
module.exports = function (deployer) {
deployer.deploy(Test, 1);
}
4.修改truffle-config.js 配置, 下面 的port对应也是本地Ganche
5.修改truffle-config.js 配置对应合约的版本
6.在终端输入 truffle compile编译
7.在终端输入truffle migrate部署

3.测试
创建test.js 
执行truffle test ,出现下面,证明测试成功。
4.使用new创建合约
上面我们知道可以通过deployed获取以及部署到链上的合约,那么如何不通过第二步部署合约直接在测试脚本里测试合约呢,就可以通过new来创建一个合约实例。
首先我们在部署脚本那里添加两行代码来打印部署时的合约地址
再在测试脚本打印一下合约地址
我们truffle test 看看 发现部署时的地址和我们测试时的地址相同,说明是同一个对象
我们再写一个it测试,使用new来创建合约实例 
test 测试 
我们可以发现地址不一样了,说明我们new出来的是个新的实例对象,那由于我们是不同的对象,我们的数据肯定也就不共享了
5.使用call调用合约方法
前面我们都是通过.get()或者.set()直接调用的合约方法来进行调用合约,那么直接调用合约方法,和通过call调用有什么不同呢。 我现在有个需求,就是我希望通过调用set方法之后立刻给我返回修改的内容(在其它业务场景可以是添加一条记录返回添加的id) 下面我们修改一下合约 
然后打印调用set的返回信息 

可以看到返回的是个交易对象,那这样我们就不好拿到我们想要的修改内容(id)需要通过日志拿到(事件)result.logs[0].args.name;
下面我们通过call来调用set方法并打印回执信息: 

我们可以看到得到的就直接是我们想要的内容
6.使用钩子函数
before(function() {
// 在此块中的所有测试之前运行
});
after(function() {
// 在此块中的所有测试之后运行
});
beforeEach(function() {
// 在此块中的每个测试之前运行
});
afterEach(function() {
// 在此块中的每个测试之后运行
});
上面我们有多个测试情况,但是是在每个it里面进行deployed或者new,那这样太麻烦了,我想就是创建一个实例,其它的测试都能使用那个实例咋办呢,那么我们就可以通过before来,下面是参考代码:
我们定义一个let 变量,然后通过before来在所有的it测试之间将合约拉下来,保存到helloWorld变量中,后续的it测试就直接使用这个实例
测试得到 
假如我现在还有一个需求,希望每个it测试的环境独立干净,那么我们就可以通过beforeEach来实现 
测试得到beforeEach打印了两次,且每个测试it的地址都不同 
7.使用truffle develop 进行部署
我们安装truffle之后,有一个内置的的测试区块链网络,不需要连接本地Ganache。
区别与上文编辑连接配置,直接 控制台输入 truffle develop ,会进入truffle 控制台。
在truffle 控制台执行compile ,migrate 、test命令 会跟上文有同样的效果。
输入test进行测试


8.如何在测试脚本中计算1ether

9. 错误解决
1.版本和合约版本不一致

2.你truffle 配置文件的编译器版本和你测试合约要求编译器版本不适应。

3.像下方await 表名他是一个异步操作,返回一个promise对象,以及我们调用合约中的函数,在js测试文件都是异步操作,函数 加async 关键字, await修饰。

4.如何找sol编译器位置,找本地有多少编译器版本

更多推荐



所有评论(0)