Truffle
如何在 JavaScript 測試中監聽合約事件?
我試圖在我的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