¿Hay alguna forma de probar una función onlyOwner a partir de una prueba unitaria de Truffle/Solidity?

Tengo un contrato con una función marcada como onlyOwner (de OpenZeppelin, por lo que solo la dirección que implementó el contrato puede llamarlo).

pragma solidity ^0.4.17;

import "./Ownable.sol";

contract MyContract {

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

He creado una prueba unitaria de Truffle/Solidity para ese contrato, pero cuando llamo a la función aparece un error, ya que la dirección de llamada es diferente a la dirección que implementó el contrato.

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

¿Hay alguna manera de usar la misma dirección? ¿Y para hacer pruebas desde diferentes direcciones? Por ejemplo si quiero probar con un dueño y con otro. Sé que se puede hacer con pruebas de Javascript.

¡Gracias!

Respuestas (1)

Puede asignar un remitente (así como otros valores transaccionales) al incluir los datos en la llamada de función. En su ejemplo específico, haría:

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

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

accounts[0]es la cuenta de implementación predeterminada. Al hacer esto, está llamando myContract.myFunctioncomo propietario.

Puede usar cualquier dirección que necesite en lugar de accounts[0].

Soy consciente de configurar la dirección del remitente y otros parámetros en las pruebas de Javascript, pero eso no se puede hacer en las pruebas de Solidez. Solo para aclarar, la prueba también está escrita en Solidity.