Testen der Trüffel-Vertragsfabrik (Javascript)

Ich habe einen Hub-Vertrag (1), der eine Vertragsfactory (2) verwendet, um einen Vertrag (3) zu erstellen. Ich schreibe einige Tests in JavaScript, um sicherzustellen, dass Vertrag 3 korrekt erstellt wird. Ich kann feststellen, dass Ereignisse korrekt ausgegeben werden, aber wenn ich die Funktionen von Vertrag 3 (#tryingtobethorough) überprüfen möchte, sieht es so aus, als ob Truffle die erstellte Adresse von Vertrag 3 nicht als Vertrag erkennt (dh ) TypeError: contract3Address.functionName is not a function. Erkennt der Truffle-Javascript-Test nur Adressen als Verträge, wenn sie über Truffle-Migrationen bereitgestellt werden? Gibt es dafür eine Lösung in Javascript? Vielleicht ist es ein besserer Testfall für Solidity-Tests?

Unten sind einige vereinfachte Versionen dessen, womit ich arbeite:

Vertrag 1: Hub

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

Vertrag 2: Vertragsfabrik

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; 

    }
}

Vertrag 3: Zu erstellender Vertrag

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

JavaScript-Test Dies ist vereinfacht, aber ich denke, es gibt eine gute Idee.

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

Antworten (1)

Ein paar Probleme

In der Funktion creationvon Contract1 geben Sie zurück, newcontract3ohne dass ihr ein Wert zugewiesen wird, da es sich um eine Adresse handelt, ist der zurückgegebene Wert default address(0x0). Wahrscheinlich möchten Sie das Ergebnis von zuweisen createNewContract3().

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

In Ihrem Test weisen Sie dem contract3AddressParameter des Ereignisses den Typ zu string. Wenn Sie in Truffle mit einem Vertrag an einer bestimmten Adresse interagieren möchten, müssen Sie eine Instanz erhalten, die auf diese Adresse zeigt, dh 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
    })
  })
Danke schön! Der erstere Fehler ist ein Tippfehler von mir, als ich versuchte, dies zum Posten zu verkürzen, aber die letztere Lösung ist genau das, woran ich erinnert werden musste, danke!