pragma solidity ^0.4.23;
contract adding{
uint256 public total;
function add(uint256 val1,uint256 val2) public returns(uint256){
total = val1+val2;
return total;
}
}
Приведенный выше код добавляет два числа
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" );
});
});
});
Приведенный выше код является моим модульным тестом, но модульный тест не работает. Если я взаимодействую с моей консолью трюфелей, она будет работать
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
Я вижу следующую ошибку в своей консоли при запуске теста трюфелей
Любая вызываемая вами функция, требующая транзакции, вернет не значение, а квитанцию транзакции. Вместо этого вы можете call
использовать эту функцию, которая просто запустит функцию на локальном узле, вернет результат и фактически не имитирует транзакцию.
Вам нужно будет изменить свой код на что-то вроде этого:
return instance.add.call(3,4)
Это вернет значение из функции, а не квитанцию транзакции, которую вы сейчас получаете instance.add(3,4)
.
Другой вариант — сделать вашу функцию функцией view
или pure
, которая не требует вызова транзакции и возвращает значение:
pragma solidity ^0.4.23;
contract adding{
function add(uint256 val1,uint256 val2) public pure returns(uint256){
uint256 total = val1+val2;
return total;
}
}
Это должно работать без необходимости call
в функции. Здесь мы сделали total
переменную локальной для функции, поэтому она не хранит и не считывает данные в самой цепочке блоков и, следовательно, может рассматриваться как pure
функция.
Лаури Пелтонен
value.toString()
МД Венкатеш