afirmarEventoEmitido de una llamada de construcción de un nuevo contrato

En la actualidad, no hay forma de que pueda ver o esté documentado para poder usar fácilmente algo como esto con el marco de trufa:

Entonces, usando chai y escribiendo una prueba para implementar un contrato con algo como esto.

c = await MyContract.new();
// this wont work...
truffleAssert.eventEmitted(c, "ContractCreated", (ev) => {
    return ev.param === myInputParam;
});

Mi constructor de contratos emitirá un ContractCreatedevento. Quiero afirmar que esto sucedió y los valores son los esperados. El evento en sí y su contenido es irrelevante. Es más importante el proceso de afirmación de eventos emitidos y el tiempo de construcción del contrato.

Esperaría o desearía poder hacer esta afirmación y usar la assertEventEmittedfunción anterior.

Actualmente, la única forma que puedo ver para lograr esto es así:

    let event = c.allEvents({fromBlock: 0, toBlock: 'latest'});
    event.watch(function (error, result) {
        if (!error){
            console.log("Result: ", result);
            // or some assertions similar to assertEventEmitted(...)
        }
    });

No puedo encontrar una manera elegante de leer los registros de eventos emitidos durante la construcción del contrato usando el conjunto de herramientas de trufa.

Cuando envía una transacción, obtiene el objeto de resultado que puede afirmar, al crear el contrato, el objeto devuelto es diferente y, como tal, los registros no están disponibles para verificar la emisión de eventos.

¿Alguien sabe de una manera de obtener esos registros de eventos de una llamada de creación de contrato de trufa y usar la truffle-assertions.assertEventEmittedfunción para probar?

Gracias de antemano.

Respuestas (2)

Habiendo publicado detalles de este problema en github para truffle, obtuve algunas opciones realmente complicadas descritas por los desarrolladores aquí: https://github.com/trufflesuite/truffle/issues/1196

En resumidas cuentas, el método más simple es hacer el método que mostré anteriormente en un escenario de prueba hasta que salga V5 de Truffle o puede mover el nextlanzamiento ahora mismo en NPM.

Esto le brindará una excelente semántica para capturar el recibo de tx e iniciar sesión en una devolución de llamada al final de las llamadas de creación del contrato. Están utilizando las bibliotecas Web3.js más nuevas que tienen una gran cantidad de optimizaciones y funciones de ayuda agregadas a las llamadas comunes.

de cgewecke:

Otra cosa que le puede interesar es Truffle V5 (que está disponible en versión preliminar en npm como truffle@next). Utiliza Web3 1.0 y le permite escuchar transaccionesHash y eventos de recepción por transacción. Podrías hacer algo como:

MyContract
  .new()
  .onReceipt( receipt => {
     truffleAssert(..etc..)
     done(); // Tell mocha you finished
  });

¡Gracias https://github.com/cgewecke por toda su ayuda!

El paquete de afirmaciones de trufas puede ayudar fácilmente con esto. Una vez que el paquete está instalado, puede ejecutar lo siguiente:

// Import the package to your file
const truffleAssert = require('truffle-assertions');

// Deploy the contract
let testContract = await TestContract.new()

// Get the hash of the deployment transaction
let txHash = testContract.transactionHash

// Get the transaction result using truffleAssert
let result = await truffleAssert.createTransactionResult(testContract, txHash)

// Now look at the events using truffleAssert
truffleAssert.eventEmitted(result, 'TestEvent');

Encontrará más información sobre el paquete aquí https://github.com/rkalis/truffle-assertions

Y puede instalarlo de la siguiente manera: npm install truffle-assertions