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 res
definiert 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.
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).
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-assertions
Bibliothek 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);
schultz
AbweichenFisch
getEvent
selbst ist ziemlich einfach