Truffle

如何使用 MochaJs 正確擷取事件

  • December 4, 2018

再會,

我正在使用 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 及以下版本無法處理帶有索引參數的事件。

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