Тестирование фабрики контрактов Truffle (Javascript)

У меня есть концентрационный контракт (1), который использует фабрику контрактов (2) для создания контракта (3). Я пишу несколько тестов на JavaScript, чтобы убедиться, что контракт 3 создан правильно. Я могу сказать, что события генерируются правильно, но когда я хочу проверить функции контракта 3 (#tryingtobethorough), похоже, что Truffle не распознает созданный адрес контракта 3 как контракт (т.е.) TypeError: contract3Address.functionName is not a function. Распознает ли тестирование Truffle Javascript адреса как контракты только в том случае, если они развернуты с помощью миграции Truffle? Есть ли обходной путь для этого в Javascript? Возможно, это лучший тестовый пример для тестирования Solidity?

Ниже приведены некоторые упрощенные версии того, с чем я работаю:

Контракт 1: Хаб

import "./Contract2Interface.sol"; 

contract Contract1 {
    Contract2Interface I; 
    function Contract1(address Contract2Address){
        I = Contract2Interface(Contract2Address); 
    }
    function creation() returns (address newcontract3) {
        address theCreatedContract3 = I.createNewContract3();
        return newcontract3; 
    }
}

Контракт 2: Контрактная фабрика

import "./Contract3.sol";
import "./Contract2Interface.sol";

contract Contract2 is Contract2Interface {
    event ContractCreation(address _newContract);

    function createNewContract3() public returns(address) {

        Contract3 createdContract3 = new Contract3(); 
        ContractCreation(createdContract3);
        return createdContract3; 

    }
}

Контракт 3: Контракт должен быть создан

contract Contract3{
    uint256 public num; 
    function storeNum(uint256 newNum) public returns(bool) {
        num = newNum; 
    }
}

JavaScript Test Это упрощенно, но я думаю, что дает достаточно идеи.

beforeEach(async function(){
    contractFactory = await Contract2.new(); 
    contractHub = await Contract1.new(contractFactory.address);
  });

describe("Creating contract 3", async function(){
    it("Should allow us to create contract 3", async function(){
      let result = await contract1.createNewContract3({from: owner});
      //Event data 
      let log = resultTwo.logs[0];
      let contract3Address = log.args._newContract;
      console.log(contract3Address) //I can see this is a valid contract address & event has been emitted properly.
      let newnum = await contract3Address.storeNum(7);
      // At this point I get an error that "storeNum" is not a function of contract3Address from Truffle testing
    })
  })

Ответы (1)

Пара вопросов

В функции creationContract1 вы возвращаетесь newcontract3без присвоения значения, поскольку это адрес, возвращаемое значение будет по умолчанию address(0x0). Вероятно, вы хотите присвоить результат createNewContract3().

function creation() returns (address newcontract3) {
    newcontract3 = I.createNewContract3();
    return newcontract3; 
}

В вашем тесте вы присваиваете contract3Addressпараметру события тип string. В трюфеле, когда вы хотите взаимодействовать с контрактом по заданному адресу, вам нужно получить экземпляр, указывающий на этот адрес, const myContract = await MyContract.at("address");т.е.

describe("Creating contract 3", async function(){
    it("Should allow us to create contract 3", async function(){
      let result = await contract1.createNewContract3({from: owner});
      //Event data 
      let log = resultTwo.logs[0];
      let contract3Address = log.args._newContract;

      // Get instance pointing to address obtained from event
      const contract3 = await Contract3.at(contract3Address);

      let newnum = await contract3.storeNum(7);
      // At this point I get an error that "storeNum" is not a function of contract3Address from Truffle testing
    })
  })
Спасибо! Первая ошибка — это моя опечатка, когда я пытался сократить это до поста, но последнее решение — это именно то, о чем мне нужно было напомнить, спасибо!