Как проверить контрактные функции с помощью модификатора onlyOwner?

У меня есть контракт, который наследуется от Ownable, а некоторые его функции используют модификатор onlyOwner. Я использую трюфель для локальных развертываний в Ganache и тестирования.

Скажем, у меня есть контракт:

contract MyContract is Ownable {
    function DoSomething() public view onlyOwner { return 1; }
}

Единичный тест для этого контракта:

contract TestMyContract {
    MyContract c = MyContract(DeployedAddresses.CertifyingAgencies());
    function testDoSomething() {
        Assert.equal(c.DoSomething(), 1, "Shoudl equal 1");
    }
}

Этот тест завершился неудачно - модификатор onlyOwner, потому что msg.sender внутри этого модификатора будет адрес тестового контракта, а не адрес владельца /развертывателя.

Как проверить такие функции?

3 голоса | спросил Andrey 6 FebruaryEurope/MoscowbTue, 06 Feb 2018 18:24:17 +0300000000pmTue, 06 Feb 2018 18:24:17 +030018 2018, 18:24:17

2 ответа


2

Я написал test.js, чтобы показать пример того, как вы можете протестировать этот модификатор:

var MyContract = artifacts.require("MyContract")

contract('MyContract', (accounts) => {

  let instance
  let owner = accounts[0]
  let account = accounts[1]

  beforeEach(async () => {
    instance = await MyContract.deployed()
  })

  it("should check restriction", async () => {
    try {
      let result = await instance.restrictedFunction.call({from: account})
      assert.equal(result.toString(), owner)
    } catch (e) {
      console.log(`${account} is not owner`)
    }
  })
})

В этом примере тест не будет терпеть неудачу в обоих случаях; Я сделал это так, потому что это зависит от того, какой результат вы готовы получить от этого конкретного теста. Если вы хотите, чтобы он потерпел неудачу, если учетная запись не является владельцем, сделайте это изменение:

} catch (e) {
      assert.fail(null, null, `${account} is not owner`)
}
ответил Roman Frolov 6 FebruaryEurope/MoscowbTue, 06 Feb 2018 20:35:31 +0300000000pmTue, 06 Feb 2018 20:35:31 +030018 2018, 20:35:31
1

Мое предложение для тестирования следующей функции:

function RemovePlayer(address _address) public onlyadmin returns (bool)

является

 it("Only admin can remove players", async function() {
        let Error;
await Cp.AddPlayer("player1",123,{ from: accounts[1]});

try {
     await Cp.RemovePlayer(accounts[1], {from: accounts[2]  });
        } catch (error) {
            Error = error;
;
        }
        assert.notEqual(Error, undefined, 'Exception thrown');
        assert.isAbove(Error.message.search('VM Exception while processing transaction: revert'), -1, 'Error: VM Exception while processing transaction: revert');

    });

Важной частью является утверждение в улове. Как и ожидалось: Error: VM Exception while processing transaction: revert мы можем использовать его, чтобы проверить, не выдает ли модификатор onlyadmin ошибки или нет.

ответил Badr Bellaj 7 J000000Saturday18 2018, 00:17:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132