Тестирование смарт-контракта требует в Truffle: транзакция отменяется, если функция не является недействительной - PullRequest
0 голосов
/ 12 июня 2018

я пытаюсь протестировать требования смарт-контракта, используя только основательность в соответствии с этой статьей:

http://truffleframework.com/tutorials/testing-for-throws-in-solidity-tests

Это контракт, контракт с прокси-прокси и тест:

/* Testing with solidity tests. */

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/MyContract.sol";

contract TestMyContract {

function testInitialStoredValue() {
    MyContract mycontract = new MyContract();

    uint expected = 24;

    Assert.equal(mycontract.mynumber(), expected, "First number set should be 24.");
}

function testTheThrow() {
    MyContract mycontract = new MyContract(); 

    ThrowProxy throwproxy = new ThrowProxy(address(mycontract)); 
    uint num = 7;
    MyContract(address(throwproxy)).storeNum(num);

    bool r = throwproxy.execute.gas(200000)(); 

    Assert.isFalse(r, "Should be false because is should throw!");

}

function testNoThrow() {
    MyContract mycontract = new MyContract(); 

    ThrowProxy throwproxy = new ThrowProxy(address(mycontract)); 

    MyContract(address(throwproxy)).storeNum(22);

    bool r = throwproxy.execute.gas(200000)(); 

    Assert.isTrue(r, "Should be true because is should throw!");

}

}

// Proxy contract for testing throws
contract ThrowProxy {
  address public target;
  bytes data;

  function ThrowProxy(address _target) {
    target = _target;
  }

  //prime the data using the fallback function.
  function() {
    data = msg.data;
  }

  function execute() returns (bool) {
    return target.call(data);
  }
}

Если я запускаю тесты, я получаю эту ошибку:

2

Если я изменяю функцию storeNum на void с

 function storeNum(uint mynum)
        public
        returns (bool)
    {
     require(mynum > 10);
     mynumber = mynum; 
     return true;    
    }

к

 function storeNum(uint mynum)
        public
    {
     require(mynum > 10);
     mynumber = mynum; 
     return true;    
    }

тесты работают ..

Есть идеи?

Я использую трюфель v4.1.11

Ответы [ 2 ]

0 голосов
/ 22 июня 2018

Ну, я поставил вопрос в трюфельном GitHub, и он все еще открыт, может быть, это связано с недавними изменениями солидности:

https://github.com/trufflesuite/truffle/issues/1001

Обходной путь на данный момент - обернутьфункции в функции void и проверьте, успешно ли выполнено выполнение:

/*
    Contract wrapper that inherits from MyContract. This contract wraps the calls of non void functions when
    testing for exceptions.

    Why not invoke directly the function?: https://github.com/trufflesuite/truffle/issues/1001
*/

contract MyExposedContract is MyContract() {


    function callStoreNum(uint256 num)  public {
        storeNum(num);
    }

}

Затем используйте эту оболочку в своих тестах:

function testTheThrow() {
    MyExposedContract mycontract = new MyExposedContract (); 

    ThrowProxy throwproxy = new ThrowProxy(address(mycontract)); 
    uint num = 7;
    MyExposedContract (address(throwproxy)).callStoreNum(num);

    bool r = throwproxy.execute.gas(200000)(); 

    Assert.isFalse(r, "Should be false because it should throw!");

}
0 голосов
/ 12 июня 2018

Давайте посмотрим на ваш код:

function storeNum(uint mynum)
        public
        returns (bool success)
    {
     require(mynum > 10);
     mynumber = mynum; 
     return true;    
    }

Определяя returns (bool success), вы говорите компилятору солидности две вещи:

  • Существует переменная с именем success типа bool (определение переменной)
  • Эта переменная success будет возвращена функцией (возвращаемое определение)

Но ваша переменная не возвращается в конце концов (вашфункция заканчивается на return true, и поэтому вы получаете ошибку InvalidResponse в ваших тестах.

Для вашего кода наиболее эффективный код будет:

function storeNum(uint mynum)
        public
        returns (bool)    // you should define at least the type
    {
     require(mynum > 10);
     mynumber = mynum; 
     return true;    
    }

В качестве упражнения,версия с использованием переменной success:

function storeNum(uint mynum)
        public
        returns (bool success)
    {
     require(mynum > 10);
     mynumber = mynum; 
     success = true;    // don't need to use return
    }

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...