Estoy probando el estándar ERC20. Intento enviar una transacción desde una cuenta con saldo = 0, lo que debería arrojar un error. Estoy tratando de atraparlo.
En mi función de prueba, estoy usando lo siguiente:
contract('erc20 deployed', function(accounts) {
it("should not transfer 1 token from address[0] to address[1]", function(done) {
try{
return erc20Instance.transfer(accounts[1], 1);
should.fail("No error was thrown trying to cheat balance");
}
catch(error){
done();
}
});
});
Cuando lo ejecuto con truffle test me sale el siguiente error:
1) Contract: erc20 deployed
should not transfer 1 token from address[0] to address[1]:
Uncaught Error: VM Exception while processing transaction: revert
¿Cómo puedo atraparlo? Mi objetivo es probar la función de transferencia, probando que la dirección [0] no puede realizar la transacción de manera efectiva.
Prueba esto:
contract('erc20 deployed', function(accounts) {
const REVERT = "VM Exception while processing transaction: revert";
it("should not transfer 1 token from address[0] to address[1]", async function() {
try {
await erc20Instance.transfer(accounts[1], 1);
throw null;
}
catch (error) {
assert(error, "Expected an error but did not get one");
assert(error.message.startsWith(REVERT), "Expected '" + REVERT + "' but got '" + error.message + "' instead");
}
});
});
Como alternativa a la respuesta de goodvibration, también es posible usar mi truffle-assertions
biblioteca, que incluye una función de ayuda para afirmar que una función de contrato se revierte.
Se puede instalar a través de npm
npm install truffle-assertions
A continuación, se puede importar en la parte superior de su archivo de prueba
const truffleAssert = require('truffle-assertions');
Entonces se puede usar dentro de su prueba:
contract('erc20 deployed', function(accounts) {
it("should not transfer 1 token from address[0] to address[1]", async function() {
await truffleAssert.reverts(erc20Instance.transfer(accounts[1], 1), null, "No error was thrown trying to cheat balance");
});
});
La documentación completa se puede encontrar en GitHub .