Truffle

如何使用 onlyOwner 修飾符測試合約功能?

  • July 6, 2018

我有一個繼承自 Ownable 的契約,它的一些功能使用onlyOwner修飾符。我使用 truffle 進行本地部署到 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該修改器內部將是測試合約的地址,而不是所有者/部署者的地址。

如何測試這些功能?

我寫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`)
}

引用自:https://ethereum.stackexchange.com/questions/38756