Truffle
Truffle 通過 JavaScript 測試事件
我正在通過 JavaScript 文件中的 chai 和 truffle-assertions 庫測試我的合約,並測試事件是否返回正確的值。我有一個名為 Message 的事件。在我的函式中,該事件被連續呼叫兩次,但具有不同的 id 和消息。我遇到的問題是,每當我嘗試測試這兩個事件時,它都會給我一個錯誤,即使我在 remix 上檢查了它並且一切似乎都正常。只需測試事件 (truffleAssert.eventEmitted(result, ‘Message’);) 就可以正常工作。
我不能給這些事件起兩個不同的名字,因為這會給我以後的契約開發造成混亂,我最終會得到大量的事件。
我怎樣才能讓測試工作?是否有解決此錯誤的方法?
類似於下面的(雖然不能分享我的實際程式碼):
event Message(address id, bytes16 message); function messages() public { emit Message(0x1fe..., 'Almost there); emit Message(0x0, 'Congratulations'); }
我的測試文件看起來很像這樣:
const Contract = artifacts.require('./Contract.sol') const assert = require("chai").assert; const truffleAssert = require('truffle-assertions'); contract('Contract', function(accounts) { let contractInst; let owner = accounts[0]; let user1 = accounts[1]; let user2 = accounts[2]; before('getting instance before all Test Cases', async function(){ contractInst = await Contract.new({from: owner}); }) it("should check that the correct events are returned", async () => { let result = await contractInst.messages(); truffleAssert.eventEmitted(result, 'Message', (ev) => { assert.equal(ev.id, user1, 'Correct id was returned'); assert.equal(web3.toUtf8(ev.message), "Almost there", 'Correct message was returned.'); return true; }, 'Contract should return the correct message.'); truffleAssert.eventEmitted(result, 'Message', (ev) => { assert.equal(ev.id, user2, 'Correct id was returned'); assert.equal(web3.toUtf8(ev.message), "Congratulations", 'Correct message was returned.'); return true; }, 'Contract should return the correct message.'); }) })
我收到的最新錯誤消息是,我希望該事件返回 0x1fe… 地址,但它返回的是 0x0 地址,因此看起來它只是在查看最新事件的返回。同時,即使我為兩個事件都輸入了 0x0 地址,它仍然會返回錯誤消息。
謝謝!
雖然 Aquila 的答案可以作為一種解決方法,但
truffleAssert.eventEmitted()
工作方式是在事件的參數上應用過濾器函式。這樣做的缺點是您不能單獨“斷言”每個參數,但這將允許您以這種方式執行兩個斷言。我從您的另一個問題中看到您正在使用帶有 Solidity v0.5.0 的 Truffle v5,因此我更新了您的測試以使用 Web3 v1.0。
我使用以下可靠性程式碼進行測試:
event Message(address id, bytes16 message); function messages() public { emit Message(address(0), "Almost there"); emit Message(address(msg.sender), "Congratulations"); }
並將 Javascript 測試更改為:
it("should check that the correct events are returned", async () => { let result = await casino.messages(); truffleAssert.eventEmitted(result, 'Message', (ev) => { return ev.id === '0x0000000000000000000000000000000000000000' && web3.utils.hexToUtf8(ev.message) === 'Almost there'; }, 'Contract should return the correct message.'); truffleAssert.eventEmitted(result, 'Message', (ev) => { return ev.id === accounts[0] && web3.utils.hexToUtf8(ev.message) === 'Congratulations'; }, 'Contract should return the correct message.'); })
這兩個測試都通過了 Truffle v5、Solidity v0.5.0、truffle-assertions v0.7.1。