Gibt es eine Möglichkeit, eine onlyOwner-Funktion aus einem Truffle/Solidity-Einheitentest zu testen?

Ich habe einen Vertrag mit einer als onlyOwner gekennzeichneten Funktion (von OpenZeppelin, sodass nur die Adresse, die den Vertrag bereitgestellt hat, ihn aufrufen kann).

pragma solidity ^0.4.17;

import "./Ownable.sol";

contract MyContract {

    function myFunction() public onlyOwner {
        dummy();
    }
}

Ich habe einen Truffle/Solidity-Einheitentest für diesen Vertrag erstellt, aber wenn ich die Funktion aufrufe, erhalte ich eine Fehlermeldung, da sich die aufrufende Adresse von der Adresse unterscheidet, die den Vertrag bereitgestellt hat.

pragma solidity ^0.4.17;

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

contract TestMyContract {
    MyContract contract = MyContract(DeployedAddresses.MyContract());

    function testCanCallFunction() public {
        myContract.myFunction();
    }
}

Gibt es eine Möglichkeit, dieselbe Adresse zu verwenden? Und um Tests von verschiedenen Adressen aus durchzuführen? Zum Beispiel, wenn ich mit einem Besitzer und mit einem anderen testen möchte. Ich weiß, dass es mit Javascript-Tests gemacht werden kann.

Danke!

Antworten (1)

Sie können einen Absender (sowie andere Transaktionswerte) zuweisen, indem Sie die Daten in den Funktionsaufruf aufnehmen. In Ihrem konkreten Beispiel würden Sie Folgendes tun:

contract TestMyContract {
    MyContract contract = MyContract(DeployedAddresses.MyContract());

    function testCanCallFunction() public {
        myContract.myFunction({from: accounts[0]);
    }
}

accounts[0]ist das standardmäßige Bereitstellungskonto. Damit rufen Sie myContract.myFunctionals Eigentümer an.

Sie können anstelle von eine beliebige Adresse verwenden accounts[0].

Ich bin mir bewusst, dass ich die Absenderadresse und andere Parameter in Javascript-Tests festlegen kann, aber das ist in Solidity-Tests nicht möglich. Nur zur Verdeutlichung, der Test ist auch in Solidity geschrieben.