Mein Vertrag hat ein Ablaufdatum, das ich gerne testen möchte, aber ich weiß nicht, wie ich das machen soll. Wenn ich mich über die Zeit des Vertrags lustig machen könnte, wäre das Blödsinn. Die Google-Suche lieferte jedoch keine Informationen.
Als allgemeine Testmethode können Sie einen weiteren Vertrag nur zum Debuggen erstellen, der von Ihrem Produktionsvertrag abstammt. Dieser zweite Vertrag kann Methoden haben, um alles zu tun – zum Beispiel, um das Ablaufdatum auf festzulegen now
.
Wenn Sie speziell mit der Zeit herumspielen wollen, hat TestRPC eine RPC-Methode, um die Zeit vorzuspulen. Seien Sie gewarnt, Sie müssen es irgendwie in Ihren Testrahmen integrieren, da web3 nicht mitgeliefert wird.
Dies ist eine ziemlich alte Frage, aber ich dachte, ich würde dies für diejenigen hinzufügen, die suchen:
Sie können die evm_increaseTime-Methode verwenden, die Sie sowohl mit Hardhat als auch mit Ganache erhalten.
Hier ist ein Beispiel mit Ethern
await ethers.provider.send("evm_increaseTime", [10]) // add 10 seconds
await ethers.provider.send("evm_mine", []) // force mine the next block
Und hier mit web3
web3.currentProvider.send({jsonrpc: "2.0", method: "evm_increaseTime", params: [10], id: 0})
web3.currentProvider.send({jsonrpc: "2.0", method: "evm_mine", params: [], id: 0})
Ich habe meine Verträge von einem einfachen Vertrag abstammen lassen, der eine currTime()
Funktion und einen testing
booleschen Wert hat. Wenn ich testing
auf true setze, wird currTime()
eine falsche Zeit zurückgegeben, die ich mit Funktionen wie manipulieren kann addDays(uint days)
. Wenn testing
falsch ist, wird currTime()
nur zurückgegeben block.timestamp
. Jeden Ort, an dem ich den Zeitstempel überprüfen würde, rufe ich currTime()
stattdessen an.
Es gibt eine Bibliothek in Dapphub: https://github.com/dapphub/ds-warp
Ein einfaches Mixin zur Zeitsteuerung.
Geben Sie die aktuelle Uhrzeit mit era() zurück. Voranstellen der Zeit mit Warp.
warp(0), um die aktuelle Zeit an die Blockzeit zu binden.
Vertrag DSWarpTest ist DSTest { DSWarp-Warp; Funktion setUp() { warp = new DSWarp(); } Funktion testInit() { assertEq(warp.era(), jetzt); } Funktion testWarp() { var tic = jetzt; warp.warp(1); assertEq(warp.era(), tic + 1); } Funktion testWarpLock() { warp.warp(0); assertEq(warp.era(), jetzt); } Funktion testFailAfterWarpLock() { warp.warp(0); warp.warp(1); } }
Daniel Köbe
Daniel Köbe