Solidity

來自新合約構造呼叫的 assertEventEmitted

  • December 9, 2019

目前,我無法看到或記錄到能夠輕鬆地將這樣的東西與 truffle 框架一起使用:

所以使用 chai 並編寫一個測試來部署一個類似這樣的合約。

c = await MyContract.new();
// this wont work...
truffleAssert.eventEmitted(c, "ContractCreated", (ev) => {
   return ev.param === myInputParam;
});

我的合約建構子將發出一個ContractCreated事件。我想斷言這發生了,並且值符合預期。事件本身及其內容無關緊要。它更多的是發出斷言事件的過程,並且契約建構時間很重要。

我希望或希望我可以做這個斷言並使用assertEventEmitted上面的函式。

目前我能看到的唯一方法是:

   let event = c.allEvents({fromBlock: 0, toBlock: 'latest'});
   event.watch(function (error, result) {
       if (!error){
           console.log("Result: ", result);
           // or some assertions similar to assertEventEmitted(...)
       }
   });

我找不到一種優雅的方式來使用 truffle 工具集讀取合約建構期間發出的事件日誌。

當您發送交易時,您會獲得可以斷言的結果對象,在創建合約時返回的對像是不同的,因此日誌不可用於檢查事件發射。

有誰知道從松露合約創建呼叫中獲取這些事件日誌並使用該truffle-assertions.assertEventEmitted函式進行測試的方法?

提前致謝。

將此問題的詳細資訊發佈到 github 以獲取 truffle 後,我得到了開發人員在此處概述的一些真正涉及的選項:https ://github.com/trufflesuite/truffle/issues/1196

總而言之,最簡單的方法是在測試場景中執行我上面展示的方法,直到 Truffle V5 出來,或者您可以next立即在 NPM 上移動版本。

這將為您提供一些出色的語義來擷取 tx 收據並在合約創建呼叫結束時登錄回調。他們正在使用較新的 Web3.js 庫,這些庫在常用呼叫中添加了大量優化和輔助函式。

來自cgewecke

您可能感興趣的另一件事是 Truffle V5(可從 npm 以 truffle@next 的預發布形式獲得)。它使用 Web3 1.0 並允許您偵聽每筆交易的 transactionHash 和接收事件。您可以執行以下操作:

MyContract
 .new()
 .onReceipt( receipt => {
    truffleAssert(..etc..)
    done(); // Tell mocha you finished
 });

感謝https://github.com/cgewecke的所有幫助!

truffle-assertions 包可以很容易地解決這個問題。安裝軟體包後,您可以執行以下命令:

// Import the package to your file
const truffleAssert = require('truffle-assertions');

// Deploy the contract
let testContract = await TestContract.new()

// Get the hash of the deployment transaction
let txHash = testContract.transactionHash

// Get the transaction result using truffleAssert
let result = await truffleAssert.createTransactionResult(testContract, txHash)

// Now look at the events using truffleAssert
truffleAssert.eventEmitted(result, 'TestEvent');

您可以在此處找到有關該軟體包的更多資訊https://github.com/rkalis/truffle-assertions

您可以按如下方式安裝它: npm install tr​​uffle-assertions

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