如何正确测试 'onlyOwner' 修饰符的还原?
How to properly test a revert for 'onlyOwner' modifier?
在我继承自 OpenZeppelin 的 Ownable
和 AccessControl
的 Solidity 合约中,我有一个函数,合约所有者可以调用该函数来为帐户提供 ADMIN
角色。它看起来像这样:
function addAdmin(address account) public virtual onlyOwner {
_grantRole(ADMIN, account);
}
在我的测试文件中,我将 OpenZeppelin 的 test-environment
和 test-helper
与 Mocha 和 Chai 一起使用。我正在尝试测试从非所有者帐户调用 addAdmin()
是否失败。我的测试看起来像这样:
it('denies access to non-Owners to add a new ADMIN', async function() {
await expectRevert(
await pool.addAdmin(notlisted1, { from: notlisted2 }),
"Ownable: caller is not the owner"
);
});
似乎 addAdmin()
正确还原,但测试失败。当此测试失败时,我在命令行看到的消息是:
Error: Returned error: VM Exception while processing transaction: revert Ownable: caller is not the owner -- Reason given: Ownable: caller is not the owner.
对这里发生的事情有什么想法吗?为什么 expectRevert()
断言不通过?
这实际上是一个简单的错误。在 pool.addAdmin()
之前使用 await
是不正确的。删除它解决了这个问题。
在我继承自 OpenZeppelin 的 Ownable
和 AccessControl
的 Solidity 合约中,我有一个函数,合约所有者可以调用该函数来为帐户提供 ADMIN
角色。它看起来像这样:
function addAdmin(address account) public virtual onlyOwner {
_grantRole(ADMIN, account);
}
在我的测试文件中,我将 OpenZeppelin 的 test-environment
和 test-helper
与 Mocha 和 Chai 一起使用。我正在尝试测试从非所有者帐户调用 addAdmin()
是否失败。我的测试看起来像这样:
it('denies access to non-Owners to add a new ADMIN', async function() {
await expectRevert(
await pool.addAdmin(notlisted1, { from: notlisted2 }),
"Ownable: caller is not the owner"
);
});
似乎 addAdmin()
正确还原,但测试失败。当此测试失败时,我在命令行看到的消息是:
Error: Returned error: VM Exception while processing transaction: revert Ownable: caller is not the owner -- Reason given: Ownable: caller is not the owner.
对这里发生的事情有什么想法吗?为什么 expectRevert()
断言不通过?
这实际上是一个简单的错误。在 pool.addAdmin()
之前使用 await
是不正确的。删除它解决了这个问题。