El código ERC20 TestToken devuelve 0 para la asignación después de la aprobación [duplicado]

Tengo el siguiente código en mi testtoken.js y me pregunto por qué la afirmación falla con "AssertionError: la asignación no se estableció en 30: se esperaba que '0' fuera igual a 30".

it("Approve an allowance of 30 between act0 and act1", function() {
    return TestToken.deployed().then(function(instance) {
      tt = instance;
      tt.approve.call(accounts[1], 30);
      return tt.allowance.call(accounts[0], accounts[1])
    }).then(function(allowance) {
      assert.equal(allowance.valueOf(), 30, "allowance wasn't set to 30");
    });
  });

Esto también devuelve 0 desde la línea de comando:

TestToken.deployed().then(function(instance){tt = instance;tt.approve.call(web3.eth.accounts[1], 30);return tt.allowance.call(web3.eth.accounts[0], web3.eth.accounts[1])});

¿Parece que el estado no se mantiene después de la aprobación?

EDITAR : Mi caso de prueba fijo:

it("Approve an allowance of 30 between act0 and act1", function() {
    return TestToken.deployed().then(function(instance){
      tt = instance;
      tt.approve(web3.eth.accounts[1], 30);
      return tt.allowance.call(web3.eth.accounts[0], web3.eth.accounts[1]).then(function(allowance){
        assert.equal(allowance.valueOf(), 30, "allowance wasn't set to 30");
      })
    });
})
Estás haciendo una llamada, las llamadas no modifican el almacenamiento del contrato. Necesitas crear una transacción tt.approve(accounts[1], 30).then(() => tt.allowance.call(accounts[0], accounts[1]); ).then(allowance => console.log(allowance.toNumber())).
@Ismael tenías razón!
Cambia el nodo. Reemplacé GetBlockcon Moralisy trabajé

Respuestas (1)

Si el contrato que está probando está en una cadena de bloques real (ropsten, rinkeby, etc.) y no en una cadena de bloques de prueba como Ganache, es muy probable que no esté esperando a que se extraiga la transacción. Inmediatamente verifica la asignación de la cuenta después de enviar la transacción. Deberá esperar a que se extraiga la transacción antes de verificar.

También es posible usar un lenguaje como golang para verificar los datos de estado pendientes, en cuyo caso esto funcionaría, sin embargo, no estoy seguro de si web3j tiene o no algo similar a esto.

Dado que está ejecutando sus pruebas en trufas, existe la posibilidad de que cuando envíe su llamada para la asignación recientemente actualizada, esa trufa no haya terminado de extraer el bloque actual. Intente agregar un tiempo de sueño de 1 segundo después de enviar la actualización de la asignación, antes de verificar la nueva asignación.

Estoy probando en el entorno local de trufas. ¿No son las transacciones instantáneas allí? ¿O no son para imitar una cadena de bloques real como la que describiste?
Si ese es el caso, ¿está seguro de que realmente puede hacer la llamada? Parece que podría estar golpeando un error de reversión de transacción, publique su código de solidez, puede ayudar a depurar esto.
Incluso si está ejecutando un entorno de trufas local, lleva algo de tiempo (milisegundos) extraer la transacción. Antes de que se extraiga esa transacción, la llamada a allowanceya podría haberse realizado, devolviendo el valor anterior
Ese es un buen punto también. Intente dormir durante 1 segundo antes de verificar el saldo recién actualizado
¿Cómo puedo dormir/esperar/pausa por un segundo?
Personalmente, no conozco muy bien javascript, pero esto debería ayudar sitepoint.com/delay-sleep-pause-wait