Prueba pasa con Remix pero falla con Truffle

Tengo dos contratos: ElephanteumStorage y ElephanteumCore. El almacenamiento solo guarda algunos datos. Se proporciona Core para cambiar los datos en el almacenamiento.
Como argumento del constructor, ElephanteumCore recibe la dirección de almacenamiento para que Core pueda llamar a las funciones de almacenamiento. Además, he establecido a Core como propietario del Almacenamiento.
Escribí la función de inicio en Core que debe guardar datos en el almacenamiento y probé esta funcionalidad en Remix IDE con Rinkeby y JS VM y todo estuvo bien. Pero en la prueba de Truffle recibí un mensaje de error de reversión.

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;
        } 
}

Y ahí está mi prueba de trufa:

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");

  })

Traté de ejecutar la prueba tanto en testrpc como en rinkeby, en todas partes genera una excepción en línea

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

Y no sé por qué.

Respuestas (2)

Usas la función setElephantsRemainingToAssignen la función de inicio, pero no veo esa función en el ElephanteumStoragecontrato.

He eliminado algunas funciones y variables para simplificar el ejemplo. Ahora el ejemplo es verdadero. Como dije, he probado la funcionalidad en Remix. Supongo que el problema está en la prueba de la trufa.

Eliminé el directorio "compilar" y ahora funciona. El problema era que Truffle no recompilaba los contratos antes de ejecutar la prueba de forma predeterminada.