Der ERC20-TestToken-Code gibt 0 für die Genehmigung nach der Genehmigung zurück [Duplikat]

Ich habe den folgenden Code in meiner testtoken.js und frage mich, warum die Behauptung mit "AssertionError: Allowance wasn't set to 30: Expected '0' to equal 30" fehlschlägt.

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");
    });
  });

Dies gibt auch 0 von der Befehlszeile zurück:

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])});

Es scheint, als ob der Zustand nach der Genehmigung nicht beibehalten wird?

EDIT : Mein fester Testfall:

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");
      })
    });
})
Sie führen einen Anruf durch, Anrufe verändern die Vertragsspeicherung nicht. Sie müssen eine Transaktion erstellen tt.approve(accounts[1], 30).then(() => tt.allowance.call(accounts[0], accounts[1]); ).then(allowance => console.log(allowance.toNumber())).
@Ismael du hattest Recht!
Ändern Sie den Knoten. Ich ersetzte GetBlockmit Moralisund arbeitete

Antworten (1)

Wenn sich der Vertrag, den Sie testen, auf einer echten Blockchain (Ropsten, Rinkeby usw.) und nicht auf einer Test-Blockchain wie Ganache befindet, ist es mehr als wahrscheinlich, dass Sie nicht darauf warten, dass die Transaktion abgebaut wird. Sie überprüfen sofort nach dem Absenden der Transaktion die Kontodeckung. Sie müssen warten, bis die Transaktion abgebaut ist, bevor Sie sie überprüfen.

Es ist auch möglich, eine Sprache wie golang zu verwenden, um ausstehende Zustandsdaten zu überprüfen. In diesem Fall würde dies funktionieren, aber ich bin mir nicht sicher, ob web3j etwas Ähnliches hat oder nicht.

Da Sie Ihre Tests mit Trüffeln durchführen, besteht die Möglichkeit, dass diese Trüffel den aktuellen Block noch nicht abgebaut hat, wenn Sie Ihren Aufruf für die neu aktualisierte Genehmigung einreichen. Versuchen Sie, eine Ruhezeit von 1 Sekunde hinzuzufügen, nachdem Sie die Aktualisierung des Freibetrags gesendet haben, bevor Sie den neuen Freibetrag überprüfen.

Ich teste in einer lokalen Trüffelumgebung. Sind die Transaktionen dort nicht sofort verfügbar? Oder sollen sie nicht eine echte Blockchain nachahmen, wie Sie es beschrieben haben?
Wenn ja, sind Sie sicher, dass Sie tatsächlich telefonieren dürfen? Es hört sich so an, als ob Sie möglicherweise auf einen Transaktionsrückkehrfehler stoßen. Posten Sie Ihren Solidity-Code. Dies kann hilfreich sein, um dies zu debuggen.
Selbst wenn Sie eine lokale Truffle-Umgebung betreiben, dauert es einige Zeit (Millisekunden), um die Transaktion abzubauen. Bevor diese Transaktion abgebaut wird, könnte der Aufruf allowancebereits getätigt worden sein und den alten Wert zurückgeben
Das ist auch ein guter Punkt. Versuchen Sie, 1 Sekunde lang zu schlafen, bevor Sie nach dem neu aktualisierten Guthaben suchen
Wie kann ich für eine Sekunde schlafen/warten/pausieren?
Ich persönlich kenne Javascript nicht sehr gut, aber das sollte sitepoint.com/delay-sleep-pause-wait helfen