Находясь в проекте, использующем Ethereum, я столкнулся с новой проблемой, связанной с проверкой события, испускаемого трюфелем, ниже приводится описание:
У меня есть функция контракта, которая, наконец, выдает имя события purchaseEvent . Мой контракт выглядит следующим образом:
pragma solidity >=0.4.21 <0.7.0;
contract EventContract {
address public owner;
uint constant price = 1000000000
event purchaseEvent(string name, uint number, uint total);
constructor() public {
owner = msg.sender;
}
function purchase(string memory name, uint number) public{
emit purchaseEvent(name, number, number*price);
}
}
В тесте трюфелей я заставил трюфель прослушивать событие (предположим, что у меня уже есть адрес контракта): mainContract = создать контракт с использованием артефактов EventContract
let instance = Contract({
abi: Artifact.abi,
bytecode: Artifact.bytecode
})
let provider = new Web3.providers.WebsocketProvider('ws://localhost:7777')
instance.setProvider(provider)
eventContract = await instance.at(mainContract.address)
await eventContract.purchaseEvent({}, async(err, event)=>{
handleEvent(event.returnValues)
})
Моя функция handleEvent:
function handleEvent(event){
console.log('Bill:', event.total)
// do calculation with value of 'total'
}
Она (обработчик событий) работает нормально, когда я звоню на покупку с помощью contractInstance.purchase ('tony', 5)
Теперь у меня есть проблема с тестированием: Как я могу «подделать» значение «цена» (или «общий» результат) для целей тестирования
Моя идея У меня тогда есть некоторые параметры:
Создайте дополнительный контракт с именем «TestEvent», где цена = ДРУГОЕ значение для тестирования. Все будет хорошо, но написание другого контракта может испортить проект.
(что я сделал) Напишите небольшой объем кода для изменения поведения handleEvent:
function handleEvent(event){
if (process.env.status == 'test') event.total = 50 // assign a constant for testing
console.log('Bill:', event.total)
// do calculation with value of 'total'
}
Но вполне вероятно, что логи функции испортят c, не так ли?
Не могли бы вы поделиться своим опытом проведения такого теста? Большое спасибо