У меня есть контракт с функцией, помеченной как 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.
Спасибо!
Вы можете назначить отправителя (а также другие транзакционные значения), включив данные в вызов функции. В вашем конкретном примере вы должны сделать:
contract TestMyContract {
MyContract contract = MyContract(DeployedAddresses.MyContract());
function testCanCallFunction() public {
myContract.myFunction({from: accounts[0]);
}
}
accounts[0]
является учетной записью развертывания по умолчанию. Делая это, вы звоните myContract.myFunction
как владелец.
Вы можете использовать любой адрес вместо accounts[0]
.
Патрисио