Wie kann ich die Zeit für Soliditätstests verspotten?

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.

Antworten (4)

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.

Aber es gab keine Möglichkeit, die Zeit zurückzusetzen, also habe ich eine PR für diese Funktion erstellt

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})
Bruder, du bist ein Lebensretter!

Ich habe meine Verträge von einem einfachen Vertrag abstammen lassen, der eine currTime()Funktion und einen testingbooleschen Wert hat. Wenn ich testingauf true setze, wird currTime()eine falsche Zeit zurückgegeben, die ich mit Funktionen wie manipulieren kann addDays(uint days). Wenn testingfalsch ist, wird currTime()nur zurückgegeben block.timestamp. Jeden Ort, an dem ich den Zeitstempel überprüfen würde, rufe ich currTime()stattdessen an.

Danke für den Tipp, das war, was ich brauchte, um meine Tests zum Laufen zu bringen. Eine weitere Frage: Wenn Sie Ihren Vertrag bereitstellen, entfernen Sie den Vertrag, mit dem Sie die aktuelle Zeit manipulieren?
Das ist schwierig. Sie möchten den getesteten Code nicht wirklich ändern, wenn Sie ihn bereitstellen, aber es ist auch ziemlich unangenehm, ihn drin zu lassen. Ich denke, Sie müssen nur entscheiden, was für Ihren speziellen Vertrag am besten ist.
Guter Anruf. Ich habe tatsächlich alle meine Tests in Mocha-Tests umgeschrieben, da es einfacher ist, die Zeit auf diese Weise zu manipulieren.

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);
    }
}