Тест проходит с Remix, но не с Truffle

У меня два контракта: ElephanteumStorage и ElephanteumCore. Хранилище просто хранит некоторые данные. Ядро предназначено для изменения данных в Хранилище.
В качестве аргумента конструктора ElephanteumCore получает адрес Storage, чтобы Core мог вызывать функции Storage. Кроме того, я установил Core в качестве владельца хранилища.
Я написал функцию инициализации в Core, которая должна сохранять данные в хранилище, и я протестировал эту функцию в Remix IDE с Rinkeby и JS VM, и все было в порядке. Но в тесте Truffle я получил сообщение об ошибке возврата.

contract ElephanteumCore is Ownable {

        ElephanteumStorage public eStorage;

        function ElephanteumCore(address _eStorage) public payable {
            eStorage = ElephanteumStorage(_eStorage);     
        }

        function init(bytes32 _name, bytes32 _symbol, uint _supply) public onlyOwner {
            eStorage.setTotalSupply(_supply);
            eStorage.setElephantsRemainingToAssign(_supply);
            eStorage.setName(_name);
            eStorage.setSymbol(_symbol);
        }
}




contract ElephanteumStorage is Ownable {

        bytes32 public name;
        bytes32 public symbol;

        uint public totalSupply;

        uint public elephantsRemainingToAssign;

        function setName(bytes32 _name) onlyOwner external {
            name = _name;
        }

        function setSymbol(bytes32 _symbol) onlyOwner external {
            symbol = _symbol;
        }

        function setTotalSupply(uint _totalSupply) onlyOwner external {
            totalSupply = _totalSupply;
        }

        function setElephantsRemainingToAssign(uint _elephantsRemainingToAssign) onlyOwner external {
            elephantsRemainingToAssign = _elephantsRemainingToAssign;
        } 
}

А вот и мой трюфельный тест:

const elephanteumCore = artifacts.require('ElephanteumCore');
const elephanteumStorage = artifacts.require('ElephanteumStorage');


contract('ElephanteumCore', accounts => {
  let eCore, eStorage;

  before(async () => {
    eStorage = await elephanteumStorage.new();
    eCore = await elephanteumCore.new(eStorage.address);
    await eStorage.transferOwnership(eCore.address);
  })

  it('Should initialize the contract correcty', async () => {
    let name = "Elephanteum";
    let symbol = "EPH";
    let supply = 100;

    await eCore.init(name, symbol, supply);

    let rName =  await eStorage.name.call();
    let rSymbol = await eStorage.symbol.call();
    let rSupply = await eStorage.totalSupply.call();

    assert.equal(name, web3.toUtf8(rName), "name should have be initialize correctly");
    assert.equal(symbol, web3.toUtf8(rSymbol), "symbol should have be initialize correctly");
    assert.equal(supply, rSupply.toNumber(), "supply should have be initialize correctly");

  })

Я пытался запустить тест как в testrpc, так и в rinkeby, везде он вызывает исключение в строке

await eCore.init(name, symbol, supply);

И я не знаю, почему.

Ответы (2)

Вы используете функцию setElephantsRemainingToAssignв функции инициализации, но я не вижу этой функции в ElephanteumStorageконтракте.

Я удалил некоторые функции и переменные, чтобы упростить пример. Теперь пример верный. Как я уже сказал, я протестировал функциональность в Remix. Полагаю, проблема в трюфельном тесте.

Я удалил каталог «сборка», и теперь он работает. Проблема заключалась в том, что Truffle по умолчанию не перекомпилирует контракты перед запуском теста.