Truffle
如何使用 onlyOwner 修飾符測試合約功能?
我有一個繼承自 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`) }