Wie man Ereignisse mit MochaJs richtig abfängt

Schönen Tag,

Ich verwende Mochajs, um meinen Solidity-Code mit Truffle und Testrpc zu testen.

In meinem Vertrag habe ich folgendes Ereignis und Funktion:

contract store{
    event MoneyIn (address _from, uint256 _amount);

    function getMoney() payable{
        //event
        MoneyIn(msg.sender, msg.value);
    } 
}

Und das ist der Mochajs-Code:

it("Pay to store", function(){
    return storeContract.getMoney({from: account[0], value: txAmount}).then(function(res){
      assert.isDefined(res);
    });
});

Es überprüft einfach, ob die Transaktion ausgeführt wurde, indem überprüft wird, ob die resdefiniert ist.

Wenn Mocha jedoch keine Fehler auslöst, wird das Ereignis auch nicht ausgegeben. Die einzige Möglichkeit, wie ich mein Ereignis sehen kann, besteht darin, einen Fehler zu erstellen: Zum Beispiel kann ich die Assertion von isDefined(res)in ändern ifError(res).

Dadurch wird Mocha gezwungen, einen Fehler auszulösen, und als Nebenprodukt wird auch mein Ereignis ausgegeben:

1) Pay to store

Events emitted during test:
---------------------------

MoneyIn(_to: 0xa86120c19324a9ed51fe17730fce24edd69ddc9c, _amount: 300000000000000000)

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

Ich freue mich sehr über jeden Tipp, den Sie haben könnten, wie Sie Mocha dazu zwingen können, Ereignisse auszugeben, auch wenn keine Fehler vorliegen.

Antworten (3)

Erläuterung:

Diese Funktionalität ist derzeit in Truffle nicht verfügbar, da protokollierte Ereignisse bei bestandenen Tests nicht angezeigt werden ( Quellcode ).

Ich mag auch die Idee, Ereignisse beim Bestehen von Tests zu verfolgen, und es scheint, dass Truffle diese Funktion irgendwann haben wird ( Tracking-Problem ).

Problemumgehung:

Eine Möglichkeit, die Ereignisse anzuzeigen, besteht darin, sie einfach gemäß der web3-API zu beobachten und eine auszuführen console.log(siehe den Beispielcode, den ich verlinkt habe).

Ich habe console.log für einige meiner Tests verwendet, aber da sie normalerweise ganz oben in der aktuellen Ausführung angezeigt werden, habe ich mich dagegen entschieden (es war wirklich schwierig, ihnen in der richtigen Reihenfolge zu folgen). Ich bin ein bisschen froh, das jetzt zu wissen, das ist einfach so, wie es funktioniert. Ich verbrachte Tage damit, zu verstehen, was ich falsch mache.
Du könntest so etwas versuchen . Dies ist in der Einschiffung, aber es verwendet auch Mokka, also sollte so etwas sofort funktionieren, um Aussagen zu Ereignissen aus Verträgen zu machen. getEventselbst ist ziemlich einfach

In web3.js Version 1 ähnelt die Lösung dem, was @travis-jacobs vorschlägt:

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);
});

Sehen Sie hier ein vollständiges Beispiel .

Beachten Sie, dass web3-beta-35 und darunter keine Ereignisse mit indizierten Parametern verarbeiten können.

Zusätzlich zu den anderen Antworten bietet meine truffle-assertionsBibliothek auch die Möglichkeit, alle ausgegebenen Ereignisse innerhalb einer Transaktion auf die gleiche Weise zu protokollieren, wie Truffle sie im Fehlerfall ausgibt.

Die Bibliothek kann über npm installiert werden

npm install truffle-assertions

Dann kann es am Anfang Ihrer Testdatei importiert werden

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

Und schließlich kann es verwendet werden, um alle ausgegebenen Ereignisse innerhalb einer Transaktion auszugeben.

let result = storeContract.getMoney({from: account[0], value: txAmount});
truffleAssert.prettyPrintEmittedEvents(result);