Как правильно ловить события с помощью MochaJs

Добрый день,

Я использую 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)

---------------------------

Я буду очень признателен за любой ваш совет о том, как заставить мокко генерировать события, даже если ошибок нет.

Ответы (3)

Объяснение:

Этот функционал недоступен в Truffle на данный момент, так как не отображаются зарегистрированные события при прохождении тестов ( исходный код ).

Мне также нравится идея отслеживания событий при прохождении тестов, и, похоже, в Truffle в конечном итоге появится эта функция ( проблема с отслеживанием ).

Обходной путь:

Один из способов показать события — просто просмотреть их в соответствии с API web3 и выполнить console.log(см. приведенный мной пример кода).

Я использовал console.log для некоторых своих тестов, но, поскольку они обычно представлены в ТОПе текущего выполнения, я отказался от них (было очень сложно следить за ними в правильном порядке). Я немного рад узнать, что в настоящее время это работает именно так. Я провел дни, пытаясь понять, что я делаю неправильно.
Вы можете попробовать что-то вроде этого . Это в embark, но он также использует мокко, поэтому такие вещи должны работать из коробки для создания утверждений о событиях из контрактов. getEventсамо по себе довольно просто

В версии 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);