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 res
está 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.
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).
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-assertions
biblioteca 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);
Shultz
DeviatePez
getEvent
en sí es bastante sencillo