Truffle

松露測試,日誌不包含發出的事件

  • November 18, 2019

我正在呼叫一個在交易中發出事件的合約函式。此事務應包括該事件,並且通常通過以下方式可見:

const receipt = await contractInstance.someFunction()
let logs = receipt.logs

這通常包含事務中發出的事件名稱的列表。但是在我的通話中,測試輸出:

[]
   1) Test someFunction()

   Events emitted during test:
   ---------------------------

   Stored()

   ---------------------------

 1 failing

 1) Contract: Test.js
      Test someFunction():
    AssertionError: Stored event not emitted: expected false to be truthy
     at Context.it (test/test.js:145:12)
     at <anonymous>
     at process._tickCallback (internal/process/next_tick.js:188:7)

測試塊失敗:

const receipt = await instance.someFunction();
let event = validationReceipt.logs.some(l => { return l.event == "Stored" });
console.log(validationReceipt.logs);
assert.ok(event, "Stored event not emitted");

第一行執行發出事件的函式呼叫Stored。第二行按事件名稱從日誌中檢索實例。第三行只記錄包含的事件。第四行斷言事件存在於日誌中。

如測試輸出所示,日誌為空[],但發出了事件。

為什麼顯示該事件已發出但未出現在發出它的事務的日誌中?

結果交易接收日誌只包括在呼叫直接合約函式的上下文中發出的事件。如果被呼叫的函式對發出事件的單獨外部合約進行了另一次呼叫,則即使已發出事件,這些合約也不會被包含在內。

要利用其他合約發出的事件:

const sha3 = require('js-sha3').keccak_256
...

const tx = await instance.someFunction(();
let event = tx.receipt.logs.some(l => { return l.topics[0] == '0x' + sha3("Stored()") });
assert.ok(event, "Stored event not emitted");

wheresomeFunction是一個函式,它呼叫與 不同的另一個合約的函式instance

這會從接收對像中獲取日誌。日誌應包含主題,其中第一個是散列事件簽名。因此,我們可以使用我們期望的事件簽名,對其進行散列並測試日誌中是否存在。這是有效的,因為所有事件都包含在收據日誌中,但不會在 truffle/ganache 提供的事務日誌中返回。

這篇文章有幫助。

在更高版本的 Truffle(已用 測試過v5.1.0)中,在不同的交易收據屬性下可以找到相同的日誌和主題rawLogs

const tx = await instance.someFunction(();
let event = tx.receipt.rawLogs.some(l => { return l.topics[0] == '0x' + sha3("Stored()") });
assert.ok(event, "Stored event not emitted");

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