Добрый день,
Я использую mochajs для тестирования своего кода Solidity с помощью truffle и testrpc.
В моем контракте я получил следующее событие и функцию:
contract store{
event MoneyIn (address _from, uint256 _amount);
function getMoney() payable{
//event
MoneyIn(msg.sender, msg.value);
}
}
А это код mochajs:
it("Pay to store", function(){
return storeContract.getMoney({from: account[0], value: txAmount}).then(function(res){
assert.isDefined(res);
});
});
Он просто проверяет, была ли транзакция выполнена, проверяя, res
определена ли переменная.
Однако, когда мокко не выдает ошибок, он также не будет генерировать событие. Единственный способ, которым я могу увидеть свое событие, — это создать ошибку: например, я могу изменить утверждение с isDefined(res)
на ifError(res)
.
Это заставит mocha выдать ошибку, и в качестве побочного продукта он также выдаст мое событие:
1) Pay to store
Events emitted during test:
---------------------------
MoneyIn(_to: 0xa86120c19324a9ed51fe17730fce24edd69ddc9c, _amount: 300000000000000000)
---------------------------
Я буду очень признателен за любой ваш совет о том, как заставить мокко генерировать события, даже если ошибок нет.
Объяснение:
Этот функционал недоступен в Truffle на данный момент, так как не отображаются зарегистрированные события при прохождении тестов ( исходный код ).
Мне также нравится идея отслеживания событий при прохождении тестов, и, похоже, в Truffle в конечном итоге появится эта функция ( проблема с отслеживанием ).
Обходной путь:
Один из способов показать события — просто просмотреть их в соответствии с API web3 и выполнить console.log
(см. приведенный мной пример кода).
В версии 1 web3.js решение похоже на то, что предлагает @travis-jacobs:
it('school "AtAddress" event was emitted and equal to call result', async () => {
const events = await school.getPastEvents('AtAdress');
const addressFromEvent = events[0].returnValues['loc'];
assert.equal(courseAddress, addressFromEvent);
});
Полный пример смотрите здесь .
Обратите внимание, что web3-beta-35 и более ранние версии не могут обрабатывать события с индексированными параметрами.
В дополнение к другим ответам моя truffle-assertions
библиотека также предлагает возможность регистрировать все исходящие события внутри транзакции так же, как трюфель выводит их при ошибке.
Библиотеку можно установить через npm
npm install truffle-assertions
Затем его можно импортировать в верхнюю часть тестового файла.
const truffleAssert = require('truffle-assertions');
И, наконец, его можно использовать для вывода всех сгенерированных событий внутри транзакции.
let result = storeContract.getMoney({from: account[0], value: txAmount});
truffleAssert.prettyPrintEmittedEvents(result);
Шульц
DeviateFish
getEvent
само по себе довольно просто