Solidity

TDD Solidity:期望內部結構狀態

  • March 27, 2021

我是 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.8ABIEncoderV2是預設設置,不再需要 pragma 行。

請參閱0.8中的重大更改列表。


對於測試,您可以從合約繼承並在那裡實現 getter。使用繼承所需的更改是將基本契約中的變數聲明為內部變數,否則如果它們是私有的,則它們不能在繼承的契約中使用。

contract MyContractForTest is MyContract {
   function getOuter(uint _idx) public view returns (Outer memory) {
       return mapped[_idx];
   }
}

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