Wie wird ein Komponententest durchgeführt, wenn eine Funktion von einer fest codierten bereitgestellten Vertragsadresse abhängt?

Ich habe Unit-Tests für einen Vertrag mit Hardhat + Ethers + Typescript geschrieben, nennen wir es ContractA. Dieser ContractA enthält eine hartcodierte Adresse eines bereitgestellten ERC20-Tokens wie folgt TokenA = '0x...'. Also in den Tests mache ich:

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

und dann teste ich einige Funktionen, die normal funktionieren.

Aber wenn ich versuche, eine bestimmte Funktion in ContractA zu testen, die die fest codierte ERC20-Adresse wie folgt verwendet:

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

Es funktioniert nicht und ich habe die Fehlermeldung erhaltenError: VM Exception while processing transaction: revert Address: call to non-contract.

PS: Ich glaube, ich verstehe den Grund, das liegt daran, dass die in ContractA angegebene fest codierte Adresse die Adresse des ERC20-Tokens in Rinkeby ist. Als solches existiert es in der Testumgebung nicht.

Also was soll ich tun? Ist es möglich, den ERC20-Vertrag in der Testumgebung mit genau der gleichen Adresse einzusetzen, die er in Rinkeby hat? Muss ich das tun? Übrigens habe ich in meinem Projekt keinen ERC20-Vertrag.

Antworten (1)

Sie sollten Bereitstellungsinformationen an den Vertrag übergeben, z. B. über den Konstrukteur. Dann haben Sie eine gewisse Flexibilität bei Migrationen und Tests.

  • Wenn rinkeby, Adresse = fest codiert
  • Andernfalls stellen Sie einen Stub bereit und verwenden Sie diese Adresse

(Zum Beispiel).

Eine alternative Möglichkeit besteht darin, zu versuchen, die öffentliche Kette zu forken und dann dagegen zu testen.

Ich hoffe es hilft

AKTUALISIEREN

import "./IERC20.sol";

contract X {

  IERC20 token;

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

Auf einem Telefon skizziert. Keine Garantie ;-)

vielen Dank! Ich werde meine Verträge ändern, damit ich die Token-Adresse im Konstruktor übergeben kann. Wie wird es danach in den Tests funktionieren? Ich muss nur einen ERC20-Scheinvertrag bereitstellen und seine Adresse übergeben?
Klingt richtig. DannIERC20 token = IERC20(thatAddress);