Implementación de un nuevo contrato dentro del caso de prueba de trufas

Estaba tratando de realizar transacciones entre dos contratos dentro de mi caso de prueba de trufas. Pero no ha podido hacerlo. La segunda instancia del contrato vuelve siempre indefinida.

Según la documentación de truffle , la implementación de un nuevo contrato dentro de un caso de prueba se muestra a continuación:Contract2.new().then(function(instance) { contract2Instance = instance; });

El error que estoy recibiendo está TypeError: Cannot read property 'address' of undefinedenContract2Address = contract2Instance.address;

¿Alguna idea de lo que estoy haciendo mal?

var Contract1 = artifacts.require("./Contract1.sol");
var Contract2 = artifacts.require("./Contract2.sol");

contract('Contract1', function(accounts) {
  it("should put 30000000 in the second account", function() {
    var contract1Instance;
    var contract2Instance;

    var Contract1Address;
    var Contract2Address;

    return Contract1.deployed().then(function(instance) {
      contract1Instance = instance;
      Contract1Address = contract1Instance.address;  
      console.log("Contract1Address:" + Contract1Address);
      Contract2.new().then(function(instance) { contract2Instance = instance; });
      console.log("contract2Instance:" + contract2Instance);
      Contract2Address = contract2Instance.address;

      contract1Instance.deposit({from: accounts[0], value: web3.toWei(2, "ether") });
      contract2Instance.claim({ value: web3.toWei(1, "ether"), gas: 1000000 });
      return web3.eth.getBalance(Contract2Address).toString(10);
    }).then(function(balance) {
      assert.equal (30000000, 30000000, "30000000 wasn't in the first account");
    });
  });

PD: disculpe la combinación de la sintaxis nueva y antigua. Sin embargo, toda la prueba funciona en la consola de trufas.

Respuestas (1)

Está tratando de obtener la dirección antes de que se haya asignado la variable. A ver si estos comentarios ayudan:

// Contract2.new() runs first.
Contract2.new().then(function(instance) {
    // This assignment runs third (or at any time in the future).
    contract2Instance = instance;
});

// This code runs second.
console.log("contract2Instance:" + contract2Instance);
Contract2Address = contract2Instance.address;

Recuerde que una promesa se resuelve en el futuro, entonces es cuando se ejecuta su código de devolución de llamada. Mientras tanto, la ejecución continúa.

Quieres algo como esto en su lugar:

return Contract2.new().then(function (contract2Instance) {
  // All the code that requires contract2Instance must be in here.

  contract1Instance.deposit({from: accounts[0], value: web3.toWei(2, "ether") });
  contract2Instance.claim({ value: web3.toWei(1, "ether"), gas: 1000000 });
  return web3.eth.getBalance(contract2Instance.address).toString(10);
});