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
Jede aufgerufene Funktion, die eine Transaktion erfordert, gibt keinen Wert zurück, sondern die Transaktionsquittung. Stattdessen können Sie call
diese 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 view
oder 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 call
die Funktion benötigt wird. Hier haben wir die total
Variable lokal zur Funktion gemacht, sodass sie keine Daten auf der Blockchain selbst speichert oder liest und daher als pure
Funktion behandelt werden kann.
Lauri Peltonen
value.toString()
md venkatesh