Как проверить события в Truffle Tests?

Как лучше всего проверить, что события были запущены в тесте Truffle?

Ответы (3)

Я написал truffle-assertionsпакет только для этого. У него есть утверждение для проверки того, что событие было сгенерировано. По сути, он похож на более старый ответ здесь , но ему не нужно проверять определенный индекс журналов, и у него есть возможность добавлять сложные условия простым способом, передавая функцию фильтра.

npm install truffle-assertions

Вы можете импортировать его в верхней части вашего тестового файла:

const truffleAssert = require('truffle-assertions');

И используйте его внутри своего теста:

truffleAssert.eventEmitted(result, 'TestEvent', (args) => {
    return args[0] === 10n && args.secondParamName === args[2];
});

Я написал сообщение в блоге, в котором рассматривается функциональность с подробным вариантом использования для дальнейшего чтения: Проверка событий при тестировании смарт-контрактов Solidity с Truffle .

Как протестировать индексированные события?AssertionError: Event filter for onWithdraw returned no results
Индексированные события также должны работать. Если вы отправите проблему в репозиторий с некоторыми фрагментами кода, я могу взглянуть на нее. github.com/rkalis/truffle-assertions/issues

Помимо ответов Роско и Ника, также полезно знать о флаге --show-events для отладки. Используйте это так:

truffle test --show-events
это сработало для меня

Уже есть некоторые решения, например, Как прослушивать события контракта в тестах JavaScript? . Эти вопросы и ответы описывают, как прослушивать события, хотя я считаю, что лучшей стратегией является проверка событий в конце каждой транзакции. Это можно легко и надежно сделать, просто проверив квитанцию ​​о транзакции (по крайней мере, в последних версиях эфириума). Одна стратегия:

assertEventOfType: function(response, eventName, index) {
    assert.equal(response.logs[index].event, eventName, eventName + ' event should fire.');
}

Затем вам просто нужно передать ответ транзакции вместе с искомым событием и индексом события в журналах. Если вам все равно, в каком порядке запускаются события, вы можете отключить indexпараметр и вместо этого просто искать в журналах. Вы также можете проверить все другие свойства события, например, адрес пользователя, с которым связано событие, если вы определили это как параметр вашего события.