如何使用truffle来测试以太坊的事件日志Event logs?
如何使用truffle来测试以太坊的事件日志Event logs?
例如我有一个智能合约函数,它在每次调用中触发事件。
我想在每次通过的测试中发送一个事件,下面是我的一些测试:
it("should emit Error event when sending 5 ether", function(done){
var insurance = CarInsurance.deployed();
insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(done).catch(done);
});
it("should emit Error event when sending 5 ether", function(done){
var insurance = CarInsurance.deployed();
insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(function(txHash){
assert.notEqual(txHash, null);
}).then(done).catch(done);
});
it("should emit Error event when sending 5 ether", function(done){
var insurance = CarInsurance.deployed();
insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(function(done){
done();
}).catch(done);
});
但是运行结果是:
1) should emit Error event when sending 5 ether
Events emitted during test:
---------------------------
Error(error: Must send 10 ether)
---------------------------
should emit Error event when sending 5 ether (11120ms)
should emit Error event when sending 5 ether (16077ms)
3 passing (51s)
1 failing
1) Contract: CarInsurance should emit Error event when sending 5 ether:
Error: done() invoked with non-Error: 0x87ae32b8d9f8f09dbb5d7b36267370f19d2bda90d3cf7608629cd5ec17658e9b
Yo
可以看到以一个失败记录。
问题出在哪儿?
你的代码正在将 tx hash 哈希传递到done()函数中。问题在这一行:
insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(done).catch(done);
应该改成:
insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(function() { done(); }).catch(done);
然后再去测试事件看看日志情况:
it("should check events", function(done) {
var watcher = contract.Reward();
// we'll send rewards
contract.sendReward(1, 10000, {from: accounts[0]}).then(function() {
return watcher.get();
}).then(function(events) {
// now we'll check that the events are correct
assert.equal(events.length, 1);
assert.equal(events[0].args.beneficiary.valueOf(), 1);
assert.equal(events[0].args.value.valueOf(), 10000);
}).then(done).catch(done);
});
原文《以太坊常见问题和错误》中的:
http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/7/
另外推荐一些之前的教程:
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
python之高清图片爬取了解一下
高清图片爬取了解一下 前段时间在知乎看到一篇文章,关于视觉中国如何从腾讯身上扒一层皮的事情。大意就是互联网巨头在没有经过授权的情况下使用了9张来自视觉中国的照片,最后的结果是以赔偿视觉中国4w结束。原文链接: https://zhuanlan.zhihu.com/p/35045810 感兴趣的可以看看。 当然这对于我们普通人而言几乎没有什么影响。但我们要知道图片版权这回事。 今天带大家爬取的图片网站是:https://unsplash.com/ 这里的图片没有版权,你可以随便使用。而且这里面的图片质量都特别高。我的一些图片都是从这上面找的 Ajax加载图片 第一步,请求网页 我们打开网站,下拉页面发现不断加载图片,但是整个页面没有刷新,也就是页面的链接没有变化。其实这个过程就是Aiax加载的过程。 Ajax请求有特殊的类型,它叫做 xhr ,我们打开开发者工具或者按 F12键,切换到Network。 下方切换到 XHR 这里面都是经过Ajax加载的。我们往下多点几个链接发现,下方的三个参数只有 page 在变化,于是我们可以构造这个参数。来提交请求。 ``` defget_page(p...
-
下一篇
以太坊中如何获取另外一个智能合约部署的合约地址?
如何获取另外一个智能合约部署的合约地址? 我正试图从另一个工厂合约中签智能合约,然后重新部署新智能合约的地址。然而,它返回的地址是交易哈希值而不是合约地址。我相信这是因为当地址被返回时合约尚未开采。当我使用Web3部署智能合约时,它似乎一直等到智能合约被部署完成后才输出合约地址。 工厂合约如下: contract Factory { mapping(uint256 => Contract) deployedContracts; uint256 numContracts; function Factory(){ numContracts = 0; } function createContract (uint32 name) returns (address){ deployedContracts[numContracts] = new Contract(name); numContracts++; return deployedContracts[numContracts]; }} 下面是调用createContract函数的方法: factory.createContract(...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL表碎片整理
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- 2048小游戏-低调大师作品
- CentOS6,7,8上安装Nginx,支持https2.0的开启

微信收款码
支付宝收款码