Was ist der beste Weg, um zu überprüfen, ob Ereignisse in einem Truffle-Test ausgelöst wurden?
Ich habe das truffle-assertions
Paket 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
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
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 index
Parameter 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.
Senju
AssertionError: Event filter for onWithdraw returned no results
Rosco Kalis