Solidity

當函式依賴於硬編碼的部署合約地址時,如何進行單元測試?

  • March 24, 2021

我一直在使用 Hardhat + Ethers + Typescript 為合約編寫單元測試,我們稱之為 ContractA。這個 ContractA 有一個已部署 ERC20 代幣的硬編碼地址,如下所示TokenA = '0x...'。所以在我做的測試中:

ContractA = await ethers.getContractFactory("ContractA");
contractA = await upgrades.deployProxy(ContractA);

然後我繼續測試一些正常工作的功能。

但是,當我嘗試在 ContractA 中測試使用硬編碼 ERC20 地址的特定函式時,如下所示:

function buyExtra(address Owner, uint256 count) public whenNotPaused {
...
IERC20Upgradeable(TokenA).safeTransferFrom(msg.sender, address(this), count);
...
}

它不起作用,我收到了錯誤 Error: VM Exception while processing transaction: revert Address: call to non-contract.

PS:我想我明白原因了,因為ContractA中給出的硬編碼地址是Rinkeby中ERC20代幣的地址。因此,它不存在於測試環境中。

所以我該怎麼做?是否可以在測試環境中使用與 Rinkeby 中完全相同的地址部署 ERC20 合約?這是我需要做的嗎?順便說一句,我的項目中沒有 ERC20 契約。

您應該將部署資訊傳遞到契約中,例如通過建構子。然後,您在遷移和測試方面具有一定的靈活性。

  • 如果是 rinkeby,地址 = 硬編碼
  • 如果不是,請部署一個存根並使用該地址

(例如)。

另一種方法是嘗試分叉公共鏈,然後對其進行測試。

希望能幫助到你

更新

import "./IERC20.sol";

contract X {

 IERC20 token;

 constructor(address _token) {
    token = IERC20(_token);
 }
}

在手機上速寫。沒有保修 ;-)

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