Cómo capturar eventos correctamente usando MochaJs

Buen día,

Estoy usando mochajs para probar mi código Solidity usando truffle y testrpc.

En mi contrato obtuve el siguiente evento y función:

contract store{
    event MoneyIn (address _from, uint256 _amount);

    function getMoney() payable{
        //event
        MoneyIn(msg.sender, msg.value);
    } 
}

Y este es el código de mochajs:

it("Pay to store", function(){
    return storeContract.getMoney({from: account[0], value: txAmount}).then(function(res){
      assert.isDefined(res);
    });
});

Simplemente comprueba si la transacción se ejecutó comprobando si resestá definido.

Sin embargo, cuando mocha no arroja errores, tampoco emitirá el evento. La única forma en que puedo ver mi evento es creando un error: por ejemplo, puedo cambiar la afirmación de isDefined(res)a ifError(res).

Si lo hace, obligará a mocha a arrojar un error y, como producto secundario, también emitirá mi evento:

1) Pay to store

Events emitted during test:
---------------------------

MoneyIn(_to: 0xa86120c19324a9ed51fe17730fce24edd69ddc9c, _amount: 300000000000000000)

---------------------------

Apreciaré mucho cualquier consejo que pueda tener sobre cómo obligar a Mocha a emitir eventos incluso cuando no hay errores.

Respuestas (3)

Explicación:

Esta funcionalidad no está disponible en Truffle en este momento, ya que los eventos registrados no se muestran al pasar las pruebas ( código fuente ).

También me gusta la idea de rastrear eventos al pasar las pruebas, y parece que Truffle eventualmente tendrá esta característica ( problema de rastreo ).

Solución alterna:

Una forma de mostrar los eventos es simplemente verlos según la API web3 y hacer console.log(ver el código de ejemplo que he vinculado).

Usé console.log para algunas de mis pruebas, pero como generalmente se presentan en la PARTE SUPERIOR de la ejecución actual, decidí no hacerlo (fue realmente difícil seguirlos en el orden correcto). Estoy algo contento de saber que actualmente, así es como funciona. Pasé días tratando de entender qué estaba haciendo mal.
Podrías intentar algo como esto . Esto está en embarque, pero también usa mocha, por lo que este tipo de cosas deberían funcionar de manera inmediata para hacer afirmaciones sobre eventos de contratos. getEventen sí es bastante sencillo

En web3.js versión 1 la solución es similar a lo que propone @travis-jacobs:

it('school "AtAddress" event was emitted and equal to call result', async () => {
    const events = await school.getPastEvents('AtAdress');
    const addressFromEvent = events[0].returnValues['loc'];
    assert.equal(courseAddress, addressFromEvent);
});

Vea un ejemplo completo aquí .

Tenga en cuenta que web3-beta-35 y versiones anteriores no pueden manejar eventos con parámetros indexados.

Además de las otras respuestas, mi truffle-assertionsbiblioteca también ofrece la capacidad de registrar todos los eventos emitidos dentro de una transacción de la misma manera que truffle los genera por error.

La biblioteca se puede instalar a través de npm

npm install truffle-assertions

Luego, se puede importar en la parte superior de su archivo de prueba

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

Y, finalmente, se puede usar para generar todos los eventos emitidos dentro de una transacción.

let result = storeContract.getMoney({from: account[0], value: txAmount});
truffleAssert.prettyPrintEmittedEvents(result);