¿Cómo verificar eventos en Truffle Tests?

¿Cuál es la mejor manera de verificar que los eventos se dispararon en una prueba de Truffle?

Respuestas (3)

Escribí el truffle-assertionspaquete 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

¿Cómo probar eventos indexados?AssertionError: Event filter for onWithdraw returned no results
Los eventos indexados también deberían funcionar. Si envía un problema al repositorio con algunos fragmentos de código, puedo echarle un vistazo. github.com/rkalis/trufa-aserciones/problemas

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
esto funcionó para mí

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 indexpará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.