Prueba unitaria en trufa falla

pragma solidity ^0.4.23;

contract adding{

  uint256 public total;
  function  add(uint256 val1,uint256 val2) public returns(uint256){
    total = val1+val2;
    return total;
  }
}

El código anterior agrega dos números

var adding  = artifacts .require("./adding.sol");

contract ('adding', function(accounts){

  it ("it will add two numbers", function(){
    return adding.deployed().then(function(i){
      instance = i ;
      return instance.add(3,4)
    }).then(function(value){
      assert.equal(value,7,"the values of 3 and 4 must be equal to 7" );
    });
  });
});

El código anterior es mi prueba de unidad, pero la prueba de unidad falla. Si interactúo con mi consola de trufas funcionará

  Contract: adding
    1) it will add two numbers
    > No events were emitted


      0 passing (115ms)
      1 failing

      1) Contract: adding
           it will add two numbers:
         AssertionError: the values of 3 and 4 must be equal to 7: expected { Object (tx, receipt, ...) } to equal 7

Puedo ver el siguiente error en mi consola mientras ejecuto la prueba de trufa

Prueba a comprobarvalue.toString()
actualicé mi código pero obtuve el mismo error al pasar (105 ms) 1 fallando 1) Contrato: agregarlo agregará dos números: los valores de 3 y 4 deben ser iguales a 7 + esperado - real - [objeto Objeto] +7

Respuestas (1)

Cualquier función a la que llame que requiera una transacción no devolverá un valor, sino el recibo de la transacción. En cambio, puede callusar esa función, que simplemente ejecutará la función en el nodo local, devolverá el resultado y no emitirá una transacción.

Tendrías que cambiar tu código a algo como esto:

return instance.add.call(3,4)

Esto devolverá el valor de la función en lugar del recibo de la transacción que está recibiendo ahora instance.add(3,4).

La otra opción es hacer que su función sea una función viewo pure, que no requiere una transacción para llamar y devolverá el valor:

pragma solidity ^0.4.23;

contract adding{
  function add(uint256 val1,uint256 val2) public pure returns(uint256){
    uint256 total = val1+val2;
    return total;
  }
}

Esto debería funcionar sin necesidad de callla función. Aquí, hicimos que la totalvariable fuera local para la función, por lo que no almacena ni lee ningún dato en la propia cadena de bloques y, por lo tanto, puede tratarse como una purefunción.

hola muchas gracias puedes cuidar el siguiente enlace ethereum.stackexchange.com/questions/60610/…