Solidity
如何使用 truffle-assertions 來驗證發射的參數?
除了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 的方法。