Solidity
當函式依賴於硬編碼的部署合約地址時,如何進行單元測試?
我一直在使用 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); } }
在手機上速寫。沒有保修 ;-)