【问题标题】:Testing events in Solidity contracts using Truffle使用 Truffle 测试 Solidity 合约中的事件
【发布时间】:2018-12-11 14:52:23
【问题描述】:

我正在尝试测试是否发生了事件,但无论输入是什么,测试都通过了。

我想我在等待结果时做错了,它只是通过测试,因此永远不会被断言为假。

我的测试看起来像这样(acc2 是一个持有地址的常量):

it('Should emit an event on this call.', async () => {
    const testingOraclize = await TestingOraclize.new()
    let actual = await testingOraclize.myFunc({from:acc2})
    await truffleAssert.eventEmitted(actual , 'ParticipateStatus', async (res) => {
      return res._statusCode.toNumber() === 0;
    })
  });

我在测试文件中的导入是:

const TestingOraclize = artifacts.require('contracts/BetBank.sol');
const assert = require("chai").assert;
const truffleAssert = require('truffle-assertions');

Solidity 合约中的事件

event ParticipateStatus(uint8 _statusCode, address _owner, address _participant);

MyFunc(addresses[msg.sender] 确实解析为 true):

function MyFunc() external payable {
    if (addresses[msg.sender]) {
      emit ParticipateStatus(0, allRunningBets[_betListIndex].betPlacer, msg.sender);
      return;
    }
}

我在这里错过了什么?

【问题讨论】:

    标签: javascript testing solidity truffle


    【解决方案1】:

    我相信您需要为下面的行添加 await 以及它实际上是一个需要解决的承诺。因为,您并没有在这里等待承诺被履行,看起来控件正在跳转到恰好是您的事件触发的下一行。

    let actual = await testingOraclize.myFunc({from:acc2})
    

    编辑 1:

    删除 truffleAssert 函数中的异步和等待。

    【讨论】:

    • 我的头正要撞在桌面上,但事实并非如此。发布问题时出了点问题。代码中实际上有一个 await 。所以这不是问题。
    • 分享函数 myFunc 的代码,那里可能缺少一些东西,因为仅查看测试用例就没有什么可说的了
    • 我编辑了原帖。实际上有多个 if 语句,但为了使其更具可读性,我将其省略了,因为第一个是我感兴趣的分支并且存在问题。
    • 嗨@RuudHermans,我是您正在使用的 truffle-assertions 库的作者。感谢您使用该库,很高兴看到您已解决该问题。您是否有指向您使用的教程的链接,所以我可以看到它们有什么问题?反正GitHub repo上有文档,我写了tutorial on my own blog as well
    • @RoscoKalis 我没有那个链接了。它不是任何官方文档的一部分,如果我没记错的话,它来自 medium.com 上的一篇文章
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多