¿Por qué no puedo detectar errores de solidez al probar con trufa?

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.

Respuestas (2)

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-assertionsbiblioteca, 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 .