Модульный тест в трюфеле не работает

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

Я вижу следующую ошибку в своей консоли при запуске теста трюфелей

Попробуйте проверитьvalue.toString()
я обновил свой код, но получаю ту же ошибку прохождения (105 мс) 1 сбой 1) Контракт: добавление добавит два числа: значения 3 и 4 должны быть равны 7 + ожидаемое - фактическое - [объект Объект] +7

Ответы (1)

Любая вызываемая вами функция, требующая транзакции, вернет не значение, а квитанцию ​​транзакции. Вместо этого вы можете 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функция.

привет Большое спасибо, вы можете посмотреть следующую ссылку ethereum.stackexchange.com/questions/60610/…