Как протестировать смарт-контракт с вызовом кросс-контракта с использованием трюфеля?

У меня два контракта, которые я записываю в один файл с названием Sum.sol. Сумма контракта вызывает Добавить контракт. Я просто хочу протестировать перекрестный вызов контракта. Если бы я не поместил два контракта в один файл, компиляция Sum с использованием трюфеля не удалась. Но когда я провожу тест, результат получается очень странным. Не знаю, как это случилось.

pragma solidity ^0.4.6;
contract Add{
  function sum(uint x, uint y) returns(uint){
    return x+y;
  }
}
contract Sum{
  function func(uint x, uint y) returns(uint){
    Add add = new Add();
    uint re = add.sum(x,y);
    return re;
  }
}

Затем я пишу тест на трюфель

contract('Sum', function(accounts) {
  it("should return 5 when add 2 and 3", function() {
    var sum = Sum.deployed();

    return sum.func.call(2,3).then(function(res){
      assert.equal(res.valueOf(), 5, "add result is 5");

    });
  });
});

И протестируйте его с трюфелем, и тогда результаты будут:

Compiling Sum.sol...


  Contract: Sum
    1) should return 5 when add 2 and 3
    > No events were emitted


  0 passing (455ms)
  1 failing

  1) Contract: Sum should return 5 when add 2 and 3:
     AssertionError: add result is 5: expected   '9.1735649321334958107552852973512799782292704141468709142420585807991067901952e+76' to equal 5
      at /Users/maiffany/testcoverage/test/add.js:6:14
      at process._tickDomainCallback         (internal/process/next_tick.js:129:7)

person hxmmm    schedule 21.12.2016    source источник
comment
это ошибка test-rpc   -  person hxmmm    schedule 30.12.2016


Ответы (1)


Я не уверен, почему ваш тест не работал 3 месяца назад, потому что и testrpc, и трюфель с тех пор сильно изменились. В текущем состоянии ваш тест завершится неудачно, потому что Sum.deployed() вернет обещание (которое вы не можете вызывать функции напрямую).

Я прошел ваш тест со следующим кодом:

var Sum = artifacts.require("./Sum.sol");

contract('Sum', function(accounts) {
  it("should return 5 when add 2 and 3", function() {
    Sum.deployed().then(function(instance){
      instance.func.call(2,3).then(function(res){
        assert.equal(res.valueOf(), 5, "add result is 5");
      });
    });
  });
})
person David Knott    schedule 07.04.2017