Testing

測試編排合約的最佳實踐

  • January 29, 2021

讓我們將一個精心編排的合約定義為一個包含至少一個可以被另一個合約呼叫的函式的合約 - 並且僅限於該合約。

該函式將實現這樣的限制:

function foo() external {
 require(msg.sender == someOtherContract, "ERR_NOT_AUTHORIZED");
 ...
}

如何為這樣的功能編寫單元測試?

我看到兩種可能的解決方案:

  • 替換為移動到庫中msg.sender的函式,該函式在測試時被存根getMsgSender()
  • Stub msg.sender,但我知道沒有乙太坊開發框架(Truffle、Waffle 或 Hardhat)可以做到這一點

有第三種解決方案嗎?以上都沒有讓我興奮。對於後者,我受框架開發人員的擺佈。

我最終找到了更優雅的第三種解決方案。

它涉及從我正在單元測試的契約繼承,並編寫額外的功能,為任何人提供不受限制的特權來修改契約儲存。

實現看起來像這樣:

/* SDPX-License-Identifier: LGPL-3.0-or-later */
pragma solidity ^0.6.10;

contract Foo {

 uint256 public myStorageVar;

 function foo(uint256 newValue) external {
   require(msg.sender == someOtherContract, "ERR_NOT_AUTHORIZED");
   myStorageVar = newValue;
 }
}

contract Bar is Foo {
 function __godmode_foo(uint256 newValue) external {
   myStorageVar = newValue;
 }
}

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