Test d’usine de contrat de truffe (Javascript)

Karen S

Test d’usine de contrat de truffe (Javascript)


J’ai un contrat de hub (1) qui utilise une fabrique de contrats (2) pour créer un contrat (3). J’écris quelques tests en JavaScript pour m’assurer que le contrat 3 est créé correctement. Je peux dire que les événements sont correctement émis, mais lorsque je veux vérifier les fonctions du contrat 3 (#tryingtobethorough), il semble que Truffle ne reconnaisse pas l’adresse du contrat 3 créée comme un contrat (c. TypeError: contract3Address.functionName is not a function-à-d.). Les tests Javascript Truffle reconnaissent-ils uniquement les adresses comme des contrats s’ils sont déployés via des migrations Truffle? Existe-t-il un moyen de contourner cela en Javascript? Peut-être est-ce un meilleur cas de test pour les tests de Solidité?

Voici quelques versions simplifiées de ce avec quoi je travaille:

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

Contrat 2: Contract Factory

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; 

    }
}

Contrat 3: Contrat à créer

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

Test JavaScript
C’est simplifié, mais je pense que ça donne assez d’idée.

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

Réponses


 Ismael

Quelques problèmes

Dans la fonction creationde Contract1, vous retournez newcontract3sans lui attribuer une valeur, car il s’agit d’une adresse, la valeur renvoyée sera par défaut address(0x0). Vous voulez probablement attribuer le résultat de createNewContract3().

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

Dans votre test, vous affectez au contract3Addressparamètre de l’événement qui est de type string. Dans la truffe, lorsque vous souhaitez interagir avec un contrat à une adresse donnée, vous devez obtenir une instance pointant vers cette adresse, c’est-à-dire 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
    })
  })
Karen S

Je vous remercie! La première erreur est une faute de frappe de ma part lorsque j’essaye de raccourcir ceci pour poster, mais la dernière solution est exactement ce à quoi je devais me souvenir, merci!

 

#de, contrat, d’usine, JavaScript, test, truffe

 

yahoo

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *