Solidity
如何測試內部事務/委託呼叫發送的事件?
通常,使用
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
將列出所有預期的事件,但我怎樣才能在松露測試中擷取它們?
我在社區論壇中創建了一個如何使用的範例: 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
,您可以編寫一個測試,它可以同時獲取它們。