Zugriff auf testrpc-Adressen von Solidity-Tests

Ich konsultiere die Dokumente von Truffle, um zu erfahren, wie Verträge direkt in Solidität getestet werden können.

http://truffleframework.com/docs/getting_started/solidity-tests

Ich würde gerne einen Weg finden, in meinen Tests auf bestehende testrpc-Konten zu verweisen. Etwas wie:

pragma solidity ^0.4.11;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/BAToken.sol";

contract TestBAToken {
  function testNewBATokenNotFinalized() {
    address companyFundAddress = addresses[1];  // <-- I'd like this to be a predefined testrpc account
    address userFundAddress = addresses[2];
    uint256 startBlock = block.number - 100;
    uint256 endBlock = block.number + 100;
    BAToken ba = new BAToken(companyFundAddress, userFundAddress, startBlock, endBlock);
    Assert.equal(ba.isFinalized, false, "Token sale shouldn't be finalized upon initialization.");
  }
}

Ist das möglich? Wenn nicht, hat jemand gute Empfehlungen, wie man während des Testens auf vorhandene Konten verweisen kann?

Antworten (1)

addresses[1]Sie können die Adressen anstelle von und direkt in den Soliditätsvertrag einfügen addresses[2]. Wenn Sie das nicht möchten, können Sie einige Variablen im Vertrag für die Adressen deklarieren und sie wie unten gezeigt als Teil des Konstruktors initialisieren.

contract TestBAToken {
  address companyFundAddress;
  address userFundAddress;
  function TestBAToken(address address1, address address2) {
    companyFundAddress = address1;
    userFundAddress = address2;
  }
  function testNewBATokenNotFinalized() {
    uint256 startBlock = block.number - 100;
    uint256 endBlock = block.number + 100;
    BAToken ba = new BAToken(companyFundAddress, userFundAddress, startBlock, endBlock);
    Assert.equal(ba.isFinalized, false, "Token sale shouldn't be finalized upon initialization.");
  }
}

Wenn Sie möchten, dass die Adressen nur innerhalb dieser Funktion deklariert werden, anstatt den vollständigen Vertrag. Sie können sie als Argumente für die testNewBATokenNotFinalizedFunktion übergeben.

Die Art und Weise der Umsetzung hängt davon ab, wie der Vertrag aussehen soll und was er leisten soll.

Danke, aber welche Adressen würde der Anrufer verwenden? Nur irgendein hartcodierter Wert?
Dies hängt davon ab, welche companyFundAddress und userFundAddress Sie für das neue BAToken festlegen möchten, das Sie erstellen.
Der Grund, warum ich frage, ist, dass meine Tests normalerweise im Kontext des testrpc-Netzwerks ausgeführt werden, das einen Satz von zehn Konten mit ETH zum Testen generiert. Ich muss diesen Kontext irgendwie in viele meiner nicht-trivialen Tests einfügen, damit sie funktionieren. Wie mache ich das, wenn solidity die testrpc-Konten nicht kennt?
Sie können die Kontoadressen als Teil des Vertragskonstruktors übergeben. Wie Sie sehen können, hat der Konstruktor hier 2 Parameter address1 und address2, die initialisiert werden können. Sie können sich darauf beziehen, um zu erfahren, wie Sie Verträge in Trüffel mit Konstruktorparametern bereitstellen. ethereum.stackexchange.com/questions/10830/…