Solidity

如何測試內部事務/委託呼叫發送的事件?

  • July 3, 2019

通常,使用truffle我可以檢查這樣的事件:

   let { logs } = await myContract.doSomethingImportant( xxx );

   // 1500 tokens are expected to get
   expectEvent.inLogs(logs, 'myImportantEvent', {
     arg1: 111,
     arg2: 'and so on'
   });

但是,logs僅包含直接在合約函式內部觸發的事件withdrawVestedTokensByTimestamp

function doSomethingImportant(uint256 x) public returns(uint256) {
   // ... do something else here ...

   emit myImportantEvent(x, amount);

   return amount;
}

但是,如果在此函式中將發生令牌傳輸或呼叫另一個函式,這將觸發事件本身,它們不會出現在日誌中。

執行測試truffle test --show-events將列出所有預期的事件,但我怎樣才能在松露測試中擷取它們?

使用openzeppelin-test-helpers

具體使用expectEvent.inTransaction

我在社區論壇中創建了一個如何使用的範例: https ://forum.zeppelin.solutions/t/how-to-check-for-events-that-was-dispatched-in-a-nested-operation/955 /2

您正在使用的openzeppelin-test-helpers 庫實際上可以從事務中檢索所有事件。expectEvent.inLogs(logs, ...);實際上會掃描logs在事務期間發出的每個事件,並將查找您指定的事件名稱(和值)。

在您的情況下,您只需將另一個添加expectEvent.inLogs(logs, ...);到您的測試案例中,該案例具有來自其他事件的預期值。這將擷取它並完全按照您的預期進行。

此外,由於這expectEvent會搜尋事務中的所有事件,因此您實際上可以在單個事務中發出多個相同的事件。例如,如果您在emit myImportantEvent(x + 1, amount);第一個 之後立即有該行myImportantEvent,您可以編寫一個測試,它可以同時獲取它們。

引用自:https://ethereum.stackexchange.com/questions/71785