Esta es mi primera publicación en stackoverflow, así que por favor sean amables...
Estoy tratando de usar Jest para hacer algunas pruebas de extremo a extremo de una función que se comunica con un contrato inteligente implementado en una cadena de bloques de desarrollo local.
Los problemas que tengo probablemente se deban a mi falta de comprensión completa de cómo funcionan las promesas y el ciclo de eventos, pero la prueba se completa antes de que se complete la función de participación.
Aquí está la prueba:
test('stake', async () => { let tokenId; // test set up - make sure the address owns at least 1 NFT const currentBalance = (await nftContract.balanceOf(address)).toNumber(); if (currentBalance > 0) { tokenId = (await stakingContractAddress.tokenOfOwnerByIndex(address, 0)).toNumber(); } else { // if address owns no NFTs, mint one await mint(address) } // pre stake const addressBalance = (await nftContract.balanceOf(address)).toNumber(); const stakedBalance = (await stakingContractAddress.numStaked(address)).toNumber(); console.log(`addressBalance: ${addressBalance}`) // should be 1 console.log(`stakedBalance: ${stakedBalance}`) // should be 0 // stake await stake(tokenId, address); // I want this to fully complete before moving on. // post stake const newAddressBalance = (await nftContract.balanceOf(address)).toNumber(); const newStakedBalance = (await stakingContractAddress.numStaked(address)).toNumber(); console.log(`newAddressBalance: ${newAddressBalance}`) // should be 0 but is still 1 console.log(`newStakedBalance: ${newStakedBalance}`) // should be 1 but is stil 0 expect(newStakedBalance).toEqual(addressBalance); expect(newAddressBalance).toEqual(stakedBalance); });Aquí está la función de apuesta:
async function stake(tokenId, _address) { try { const tx = await nftContract['safeTransferFrom(address,address,uint256,bytes)']( _address, // from stakingContractAddress, // to tokenId, gas_price ); await tx.wait(); // this is meant to wait until the transaction is mined on-chain } catch (err) { logger.info({message: err}); process.exit(1); } }Intenté agregar en espera deliberada (a continuación) justo después de que se llama a la función de participación en la prueba. Pero esto no tiene ningún efecto. También parecía que no debería ser necesario, ya que la transacción con la cadena de bloques local debería completarse al instante.
function wait(ms){ console.log(`waiting ${ms /1000} seconds`) var start = new Date().getTime(); var end = start; while(end < start + ms) { end = new Date().getTime(); } }He pasado tanto tiempo tratando de encontrar una solución a esto sin suerte.
¡Cualquier ayuda sería muy apreciada!
Entonces, después de pensarlo un poco, reestructuré toda la aplicación para hacerla más modular y comprobable.
La aplicación inicial fue un solo script, que funcionó pero no se pudo probar.
El método Stake, entre otros, ahora está en su propio módulo y he podido probar con éxito la funcionalidad.
Moraleja de esta historia: escriba código modular y piense en probar desde el principio.