2016-04-14 3 views
8

У меня есть функция контракта, которая испускает события при каждом вызове.Test ethereum Журналы событий с трюфелем

Я хотел бы иметь событие, излучаемого на каждом испытании, проходящих, вот некоторые тесты:

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

Результаты:

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 

Вы можете видеть, что только один, который сбой журнала.

Любая идея?

Спасибо

ответ

9

Вы передаете ТЙ хэш в функцию сделали(). Я думаю, что проблема в линии:

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

Изменить это:

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

Для проверки событий:

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

Фактически, только первый тест выводит событие «Ошибка», которое я хочу. Когда я изменяю, как вы сказали, он ничего не выводит, кажется, что он ждет выполнения() ... – ltheron

+0

@ user3262670 Я вообще не вижу проверки событий в тесте. + все тестовые примеры называются «должно испускать событие« Ошибка »при отправке 5 эфиров», поэтому вы не можете сказать, кто из них не работает. – Aldekein

+0

Можем ли мы проверить события в тесте? Я хотел показать три способа выполнения одного и того же теста. Я просто хочу показать события во время тестов, и единственный способ сделать это - это когда тест завершился неудачно ... – ltheron

4

С трюфелем v3 вы получаете журналы в результате обратного вызова. Таким образом, вы могли бы сделать что-то вроде:

insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then((result) => { assert.equal(result.logs[0].event, "Error", "Expected Error event") })

Посмотреть https://github.com/trufflesuite/truffle-contract#processing-transaction-results

0

Существует помощник, чтобы сделать именно это:

npm install --save truffle-test-utils 

В верхней части теста:

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

В вашем тесте:

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

Полное раскрытие информации: Я являюсь автором этого пакета. Я написал его после поиска такого решения на SO, но не смог его найти.

 Смежные вопросы

  • Нет связанных вопросов^_^