Unit-Test in Trüffel schlägt fehl

pragma solidity ^0.4.23;

contract adding{

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

Der obige Code fügt zwei Zahlen hinzu

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

Der obige Code ist mein Komponententest, aber der Komponententest schlägt fehl. Wenn ich mit meiner Truffle-Konsole interagiere, funktioniert es

  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

Ich kann den folgenden Fehler in meiner Konsole sehen, während ich den Trüffeltest ausführe

Versuchen Sie es zu überprüfenvalue.toString()
Ich habe meinen Code aktualisiert, aber ich bekomme denselben Fehler (105 ms) 1 fehlgeschlagen 1) Vertrag: Durch Hinzufügen werden zwei Zahlen hinzugefügt: Die Werte von 3 und 4 müssen gleich 7 + erwartet sein - tatsächlich - [Objekt Objekt] +7

Antworten (1)

Jede aufgerufene Funktion, die eine Transaktion erfordert, gibt keinen Wert zurück, sondern die Transaktionsquittung. Stattdessen können Sie calldiese Funktion, die die Funktion einfach auf dem lokalen Knoten ausführt, das Ergebnis zurückgeben und nicht tatsächlich eine Transaktion ausgeben.

Sie müssten Ihren Code in etwa so ändern:

return instance.add.call(3,4)

Dadurch wird der Wert von der Funktion zurückgegeben und nicht der Transaktionsbeleg, von dem Sie jetzt zurückkommen instance.add(3,4).

Die andere Möglichkeit besteht darin, Ihre Funktion zu einer viewoder pure-Funktion zu machen, für deren Aufruf keine Transaktion erforderlich ist und die den Wert zurückgibt:

pragma solidity ^0.4.23;

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

Dies sollte funktionieren, ohne dass calldie Funktion benötigt wird. Hier haben wir die totalVariable lokal zur Funktion gemacht, sodass sie keine Daten auf der Blockchain selbst speichert oder liest und daher als pureFunktion behandelt werden kann.

hi vielen dank kannst du nach dem folgenden link ethereum.stackexchange.com/questions/60610/… schauen