Truffle

如何在 JavaScript 測試中監聽合約事件?

  • November 26, 2019

我試圖在我的solidity合約中觸發事件以在我的javascript測試中輸出一些調試資訊。然而,這些事件似乎從未被抓住。

這是相關的契約程式碼:

pragma solidity ^0.4.4;

contract CrowdFunding {

   uint public deadline;
   event DeadlineSet(uint deadline, uint timeNow);

   function withdrawal() returns(bool) {
       DeadlineSet(deadline, now);
       return true;
   }
}

以下是我嘗試在我的 JavaScript 測試文件中偵聽事件的方法:

var deadlineSet;
deadlineSet = contractInstance.DeadlineSet({_from:web3.eth.coinbase});
deadlineSet.watch(function(err, result) {
   if(err) {
       console.log(err);
       return;
   }
   console.log("Deadline " + result.args.deadline);
   console.log("Time Now " + result.args.timeNow);
   deadlineSet.stopWatching();
});

我的測試執行良好,我可以向合約和呼叫方法彙款,但我從未看到上面定義的任何控制台輸出。

任何幫助表示讚賞。

我發現並非所有事件都顯示在 truffle 輸出視窗中,儘管它們可能在執行契約時正確觸發。我相信這仍然是一個問題

在今天花了幾個小時之後,我想出了一個解決方案來測試特定事件是否被觸發。

這是我的範例松露 javascript 測試:

it("should do something that fires SaleMade", function() {
   return myContract
       .stockShelf("beer", "wine", {from: sellerAccount})
       .then(() => myContract.sell("water", "bread", {from: sellerAccount}))
       .then(() => utils.assertEvent(myContract, { event: "SaleMade", logIndex: 1, args: { name: "bread" }}));
}

上面過濾了與傳遞給我在同一文件夾中的 utils.js 中的 assertEvent 實用程序函式的過濾器對象匹配的觸發事件。在我的 javascript 測試的頂部,我已經聲明:

var utils = require("./utils.js");

我的 utils.js 類的片段如下:

var _ = require("lodash");
var Promise = require("bluebird");

module.exports = {
   assertEvent: function(contract, filter) {
       return new Promise((resolve, reject) => {
           var event = contract[filter.event]();
           event.watch();
           event.get((error, logs) => {
               var log = _.filter(logs, filter);
               if (log) {
                   resolve(log);
               } else {
                   throw Error("Failed to find filtered event for " + filter.event);
               }
           });
           event.stopWatching();
       });
   }
}

這需要預設情況下不包含在 truffle 中的其他 npm 包。預設情況下,truffle 不包含 npm 包。我設置了 npm 並安裝了所需的軟體包,如下所示:

npm init
npm install bluebird --save
npm install lodash --save

編輯:使用 testrpc

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