Есть ли способ протестировать функцию onlyOwner из модульного теста Truffle/Solidity?

У меня есть контракт с функцией, помеченной как onlyOwner (от OpenZeppelin, поэтому ее может вызывать только адрес, на котором развернут контракт).

pragma solidity ^0.4.17;

import "./Ownable.sol";

contract MyContract {

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

Я создал модульный тест Truffle/Solidity для этого контракта, но когда я вызываю функцию, я получаю сообщение об ошибке, так как адрес вызова отличается от адреса, который развернул контракт.

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

Есть ли способ использовать тот же адрес? И делать тесты с разных адресов? Например, если я хочу протестировать с владельцем и с другим. Я знаю, что это можно сделать с помощью тестов Javascript.

Спасибо!

Ответы (1)

Вы можете назначить отправителя (а также другие транзакционные значения), включив данные в вызов функции. В вашем конкретном примере вы должны сделать:

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

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

accounts[0]является учетной записью развертывания по умолчанию. Делая это, вы звоните myContract.myFunctionкак владелец.

Вы можете использовать любой адрес вместо accounts[0].

Я знаю об установке адреса отправителя и других параметров в тестах Javascript, но это невозможно сделать в тестах Solidity. Просто чтобы уточнить, тест также написан в Solidity.