Solidity

如何使用 truffle-assertions 來驗證發射的參數?

  • February 20, 2021

除了github和作者的部落格文章之外,我還沒有找到任何具有使用說明的資源

在 github 上顯示了一個範例:

truffleAssert.eventEmitted(result, 'TestEvent', (ev) => {
   return ev.param1 === 10 && ev.param2 === ev.param3;
});

在部落格文章中,語法是這樣的:

truffleAssert.eventEmitted(tx, 'Play', (ev) => {
   return ev.player === bettingAccount && !ev.betNumber.eq(ev.winningNumber);
});

這兩個都比較相似。

這是我要測試的發射:

event Emittest(uint date, address indexed from, address indexed to, uint256 value);

我的問題是,如果我嘗試執行相同的格式:

let emittest = await contract.function(accounts[1], 66500000,{from: accounts[0]});

truffleAssert.eventEmitted(emittest, 'Emittest', (ev) => {
       return ev.value == set_value;
});

它失敗並出現錯誤AssertionError: Event filter for Transfer returned no results。我可以通過將程式碼更改為:

truffleAssert.eventEmitted(emittest, 'Emittest', (ev) => {
       return ev.value.words[0] == set_value;
});

由於令牌具有以下結構:

value ==== BN {
 negative: 0,
 words: [ 60475904, 14, <1 empty item> ],
 length: 2,
 red: null
}   

訪問.words[0]似乎不是正確的方法,因為它使得在words:不編寫輔助函式的情況下檢查分佈在數組的多個索引中的 BigNumber 變得更加困難。從發出中提取的地址出現並且可以按預期訪問。多個之間的拆分words比 JavaScript 的 2^53 限制(大約 6600 萬)要快得多。我是 javascript 新手,可能做錯了很多事情。感謝幫助。

問題是您無法將對象與==(因為 javascript 中的數值沒有足夠的精度將它們包裝在 BN 對像中)進行比較。

所以你必須使用BN庫提供的方法

return !ev.value.eq(tokens_sent);

BN 庫除了.eq()查看其文件外,還有多種方法。

為了向後兼容,Truffle 還支持BigNumber庫,如果由於某種奇怪的原因 BN 的方法失敗​​,請嘗試使用 BigNumber 的方法。

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