Truffle
如何使用 MochaJs 正確擷取事件
再會,
我正在使用 mochajs 使用 truffle 和 testrpc 測試我的 Solidity 程式碼。
在我的契約中,我得到了以下事件和功能:
contract store{ event MoneyIn (address _from, uint256 _amount); function getMoney() payable{ //event MoneyIn(msg.sender, msg.value); } }
這是 mochajs 程式碼:
it("Pay to store", function(){ return storeContract.getMoney({from: account[0], value: txAmount}).then(function(res){ assert.isDefined(res); }); });
它只是通過檢查是否
res
已定義來檢查事務是否已執行。但是,當 mocha 不拋出錯誤時,它也不會發出事件。我可以看到我的事件的唯一方法是創建一個錯誤:例如,我可以將斷言從 更改
isDefined(res)
為ifError(res)
。這樣做會迫使 mocha 拋出錯誤,並且作為副產品,它也會發出我的事件:
1) Pay to store Events emitted during test: --------------------------- MoneyIn(_to: 0xa86120c19324a9ed51fe17730fce24edd69ddc9c, _amount: 300000000000000000) ---------------------------
即使沒有錯誤,我也會非常感謝您關於如何強制 mocha 發出事件的任何提示。
解釋:
此功能目前在 Truffle 中不可用,因為在通過測試時不會顯示記錄的事件(原始碼)。
我也喜歡在通過測試時跟踪事件的想法,而且似乎 Truffle 最終會擁有這個功能(跟踪問題)。
解決方法:
顯示事件的一種方法是根據web3 API簡單地觀察它們,然後執行一個
console.log
(參見我連結的範常式式碼)。
在 web3.js 版本 1 中,該解決方案類似於 @travis-jacobs 提出的解決方案:
it('school "AtAddress" event was emitted and equal to call result', async () => { const events = await school.getPastEvents('AtAdress'); const addressFromEvent = events[0].returnValues['loc']; assert.equal(courseAddress, addressFromEvent); });
在此處查看完整範例。
請注意,web3-beta-35 及以下版本無法處理帶有索引參數的事件。