Wie überprüfe ich Ereignisse in Trüffeltests?

Was ist der beste Weg, um zu überprüfen, ob Ereignisse in einem Truffle-Test ausgelöst wurden?

Antworten (3)

Ich habe das truffle-assertionsPaket nur dafür geschrieben. Es hat eine Behauptung, um zu überprüfen, ob ein Ereignis ausgegeben wurde. Im Wesentlichen ähnelt es der älteren Antwort hier , es muss jedoch kein bestimmter Index der Protokolle überprüft werden, und es besteht die Möglichkeit, komplexe Bedingungen auf einfache Weise hinzuzufügen, indem eine Filterfunktion übergeben wird.

npm install truffle-assertions

Sie können es oben in Ihre Testdatei importieren:

const truffleAssert = require('truffle-assertions');

Und verwenden Sie es in Ihrem Test:

truffleAssert.eventEmitted(result, 'TestEvent', (args) => {
    return args[0] === 10n && args.secondParamName === args[2];
});

Ich habe einen Blog-Beitrag geschrieben, der die Funktionalität mit einem detaillierten Anwendungsfall zur weiteren Lektüre behandelt: Überprüfen von Ereignissen beim Testen von Solidity Smart Contracts mit Truffle

Wie teste ich indizierte Ereignisse?AssertionError: Event filter for onWithdraw returned no results
Indizierte Ereignisse sollten ebenfalls funktionieren. Wenn Sie ein Problem mit einigen Codeschnipseln an das Repository senden, kann ich es mir ansehen. github.com/rkalis/truffle-assertions/issues

Zusätzlich zu den Antworten von Rosco und Nick ist es auch hilfreich, das Flag --show-events zum Debuggen zu beachten. Verwenden Sie es wie folgt:

truffle test --show-events
das hat bei mir funktioniert

Es gibt bereits einige Lösungen, z. B. unter How to listen for contract events in JavaScript tests? . Diese Fragen und Antworten beschreiben, wie man auf Ereignisse lauscht, während ich glaube, dass eine bessere Strategie darin besteht, am Ende jeder Transaktion nach Ereignissen zu suchen. Dies kann zuverlässig und einfach durch einfache Überprüfung des Transaktionsbelegs (zumindest in den neuesten Versionen von Ethereum) erfolgen. Eine Strategie:

assertEventOfType: function(response, eventName, index) {
    assert.equal(response.logs[index].event, eventName, eventName + ' event should fire.');
}

Dann müssen Sie nur die Transaktionsantwort zusammen mit dem gesuchten Ereignis und dem Index des Ereignisses in den Protokollen übergeben. Wenn es Ihnen egal ist, in welcher Reihenfolge die Ereignisse ausgelöst werden, können Sie den indexParameter nixen und stattdessen einfach die Protokolle durchsuchen. Sie können auch alle anderen Eigenschaften des Ereignisses überprüfen, z. B. eine Benutzeradresse, mit der das Ereignis verknüpft ist, wenn Sie dies als Parameter Ihres Ereignisses definiert haben.