2016-04-14 9 views
8

Ich habe eine Vertragsfunktion, die bei jedem Aufruf Ereignisse ausgibt.Test ethereum Ereignisprotokolle mit Trüffel

Ich mag würde ein Event auf jedem Test emittiert haben, die hier sind vorbei sind einige Tests:

it("should emit Error event when sending 5 ether", function(done){ 
    var insurance = CarInsurance.deployed(); 

    insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(done).catch(done); 
}); 

it("should emit Error event when sending 5 ether", function(done){ 
    var insurance = CarInsurance.deployed(); 

    insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(function(txHash){ 
    assert.notEqual(txHash, null); 
    }).then(done).catch(done); 
}); 

it("should emit Error event when sending 5 ether", function(done){ 
    var insurance = CarInsurance.deployed(); 

    insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(function(done){ 
    done(); 
    }).catch(done); 
}); 

Die Ergebnisse sind:

1) should emit Error event when sending 5 ether 

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

Error(error: Must send 10 ether) 

--------------------------- 
✓ should emit Error event when sending 5 ether (11120ms) 
✓ should emit Error event when sending 5 ether (16077ms) 


3 passing (51s) 
1 failing 

1) Contract: CarInsurance should emit Error event when sending 5 ether: 
Error: done() invoked with non-Error: 0x87ae32b8d9f8f09dbb5d7b36267370f19d2bda90d3cf7608629cd5ec17658e9b 

Sie können sehen, dass die einzige, die wird protokolliert fehlgeschlagen.

Irgendeine Idee?

Danke

Antwort

9

Du tx Hash in getan() Funktion übergeben. Ich denke, das Problem in Zeile ist:

insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(done).catch(done); 

Ändern Sie es an:

insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(function() { done(); }).catch(done); 

für Veranstaltungen zu testen:

it("should check events", function(done) { 
    var watcher = contract.Reward(); 

    // we'll send rewards 
    contract.sendReward(1, 10000, {from: accounts[0]}).then(function() { 
    return watcher.get(); 
    }).then(function(events) { 
    // now we'll check that the events are correct 
    assert.equal(events.length, 1); 
    assert.equal(events[0].args.beneficiary.valueOf(), 1); 
    assert.equal(events[0].args.value.valueOf(), 10000); 
    }).then(done).catch(done); 
}); 
+0

Tatsächlich gibt nur der erste Test das "Error" -Ereignis aus, das ich möchte. Wenn ich ändere, wie Sie sagten, es gibt nichts aus, scheint, dass es auf fertig() wartet ... – ltheron

+0

@ user3262670 Ich sehe keine Prüfung für Ereignisse im Test überhaupt. + Alle Testfälle haben den Namen "sollten ein Fehlerereignis beim Senden von 5 Äther senden", so dass Sie nicht sagen können, welche von ihnen fehlschlagen. – Aldekein

+0

Können wir Ereignisse im Test überprüfen? Ich wollte drei Möglichkeiten zeigen, denselben Testfall zu machen. Ich möchte nur Ereignisse während Tests anzeigen, und die einzige Möglichkeit ist, wenn der Test fehlschlägt ... – ltheron

0

Es gibt einen Helfer zu tun, nur dies:

npm install --save truffle-test-utils 

An der Spitze Ihres Tests:

require('truffle-test-utils').init(); 

In Ihrem Test:

let result = await insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}); 
assert.web3Event(result, { 
    event: 'Error', 
    args: { 
    error: 'Must send 10 ether' 
    } 
}, 'Error event when sending 5 ether'); 

Volle Offenbarung: Ich bin der Autor dieses Pakets. Ich habe es geschrieben, nachdem ich nach einer solchen Lösung für SO gesucht habe, konnte es aber nicht finden.