Тест события трюфеля: как «подделать» значения для теста интеграции событий - PullRequest
1 голос
/ 22 апреля 2020

Находясь в проекте, использующем 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)

Теперь у меня есть проблема с тестированием: Как я могу «подделать» значение «цена» (или «общий» результат) для целей тестирования

Моя идея У меня тогда есть некоторые параметры:

  1. Создайте дополнительный контракт с именем «TestEvent», где цена = ДРУГОЕ значение для тестирования. Все будет хорошо, но написание другого контракта может испортить проект.

  2. (что я сделал) Напишите небольшой объем кода для изменения поведения 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, не так ли?

Не могли бы вы поделиться своим опытом проведения такого теста? Большое спасибо

...