Solidity
TDD Solidity:期望內部結構狀態
我是 TDD/BDD 的忠實粉絲,所以我認為安全帽和 chai/waffle 是學習智能合約開發的良好開端。
我遇到了一個問題,但我想知道
expect
映射的嵌套結構的狀態是什麼最佳實踐?最小的例子:
contract MyContract { struct Inner{uint foo;} struct Outer{Inner bar;} uint idx; mapping (uint => Outer) mapped; function doSomething(uint _val) public { mapped[idx] = Outer(Inner(_val)); } }
呼叫後我將如何進行
Inner.foo
具有正確值的測試doSomething(123)
?到目前為止,我發現的唯一解決方案是創建一個
function getOuter(uint _idx) public view returns (Outer memory)
並使用它來檢索expect
測試中的值。然而,這意味著向合約添加一個僅用於測試和使用
pragma experimental ABIEncoderV2;
的功能——嗯,聽起來有點實驗性。解決這個問題的正確方法是什麼?
使用 solc v0.8
ABIEncoderV2
是預設設置,不再需要 pragma 行。請參閱0.8中的重大更改列表。
對於測試,您可以從合約繼承並在那裡實現 getter。使用繼承所需的更改是將基本契約中的變數聲明為內部變數,否則如果它們是私有的,則它們不能在繼承的契約中使用。
contract MyContractForTest is MyContract { function getOuter(uint _idx) public view returns (Outer memory) { return mapped[_idx]; } }