¿Cuál es la mejor manera de verificar que los eventos se dispararon en una prueba de Truffle?
Escribí el truffle-assertions
paquete solo para esto. Tiene una afirmación para comprobar que se ha emitido un evento. Esencialmente, es similar a la respuesta anterior aquí , pero no necesita verificar un índice específico de los registros, y tiene la opción de agregar condiciones complejas de una manera sencilla al pasar una función de filtro.
npm install truffle-assertions
Puede importarlo en la parte superior de su archivo de prueba:
const truffleAssert = require('truffle-assertions');
Y úsalo dentro de tu prueba:
truffleAssert.eventEmitted(result, 'TestEvent', (args) => {
return args[0] === 10n && args.secondParamName === args[2];
});
Escribí una publicación de blog que repasa la funcionalidad con un caso de uso detallado para leer más: Comprobación de eventos al probar contratos inteligentes de Solidity con Truffle
Además de las respuestas de Rosco y Nick, también es útil tener en cuenta el indicador --show-events para la depuración. Úsalo así:
truffle test --show-events
Ya existen algunas soluciones, como en ¿Cómo escuchar eventos de contratos en las pruebas de JavaScript? . Esas preguntas y respuestas describen cómo escuchar eventos, mientras que creo que una mejor estrategia es verificar eventos al final de cada transacción. Esto se puede hacer de manera confiable y fácil simplemente inspeccionando el recibo de la transacción (al menos en las últimas versiones de ethereum). Una estrategia:
assertEventOfType: function(response, eventName, index) {
assert.equal(response.logs[index].event, eventName, eventName + ' event should fire.');
}
Luego, solo necesita pasar la respuesta de la transacción, junto con el evento que está buscando y el índice del evento en los registros. Si no le importa en qué orden se disparan los eventos, puede anular el index
parámetro y simplemente buscar en los registros. También puede verificar todas las demás propiedades del evento, por ejemplo, una dirección de usuario con la que está asociado el evento, si lo definió como un parámetro de su evento.
senju
AssertionError: Event filter for onWithdraw returned no results
Rosco Kalis