Как лучше всего проверить, что события были запущены в тесте Truffle?
Я написал 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 .
Помимо ответов Роско и Ника, также полезно знать о флаге --show-events для отладки. Используйте это так:
truffle test --show-events
Уже есть некоторые решения, например, Как прослушивать события контракта в тестах JavaScript? . Эти вопросы и ответы описывают, как прослушивать события, хотя я считаю, что лучшей стратегией является проверка событий в конце каждой транзакции. Это можно легко и надежно сделать, просто проверив квитанцию о транзакции (по крайней мере, в последних версиях эфириума). Одна стратегия:
assertEventOfType: function(response, eventName, index) {
assert.equal(response.logs[index].event, eventName, eventName + ' event should fire.');
}
Затем вам просто нужно передать ответ транзакции вместе с искомым событием и индексом события в журналах. Если вам все равно, в каком порядке запускаются события, вы можете отключить index
параметр и вместо этого просто искать в журналах. Вы также можете проверить все другие свойства события, например, адрес пользователя, с которым связано событие, если вы определили это как параметр вашего события.
Сенджу
AssertionError: Event filter for onWithdraw returned no results
Роско Калис