Truffle

Truffle 通過 JavaScript 測試事件

  • April 27, 2020

我正在通過 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。

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