Truffle-Test

同步測試和啟用 web3 的 nodejs 服務

  • October 25, 2020

我有一個在 truffle 中執行的測試套件,以及一個正在執行的外部 web3 連接節點服務 - 兩者都連接到 ganache-cli 網路。

我的問題是:我的測試應該獲取由外部服務觸發的事件,但是,該服務僅在測試完成後呼叫區塊鏈(生成測試正在監視的事件)

(注意:我顯然正在尋找改變測試而不是服務的解決方案。請忽略測試/事件的具體時間安排,我知道我正在使用的 OZ 測試幫助程序包在後台做一些事情來推進塊和時間一旦我能理解以下內容,我就可以深入研究以通過測試)

**只想解決:**測試執行、測試完成、服務呼叫/事務、服務完成;**想要:**測試執行、服務呼叫/事務、服務完成、測試完成)

這是服務的程式碼:

var currentBlock = 0;
web3.eth.getBlockNumber()
   .then((number)=>{
       currentBlock = number;
       console.log(currentBlock);
   });

setInterval(function(){
   web3.eth.getBlock('latest',async (err,block)=>{
       if(err){
           return;
       }
       if(currentBlock <= block.number){
           console.log(`New block received, Number: ${block.number}`);            
            
           // Get scheduleCallEvent events and save
           var events = await aionContract.getPastEvents('ScheduleCallEvent', {fromBlock: currentBlock-reqConfirmations, toBlock: block.number-reqConfirmations}) 

           for(var i = 0; i < events.length; i++){
               console.log('Registering new request to the database...');
               await saveRequestedTxs(events[i],web3);
           }                                     
           
           var events = await aionContract.getPastEvents('ExecutedCallEvent', {fromBlock: currentBlock-reqConfirmations,toBlock: block.number-reqConfirmations})
           for(var i = 0; i < events.length; i++){
               console.log('Registering successfully executed Tx...');
               await saveExecutedTxs(events[i],web3);
           }           

           //Execute pending transactions if any, Block and time based schedules
           await executeRequestedTxs(block.number,false,web3,account,aionContract);
           await executeRequestedTxs(block.timestamp,true,web3,account,aionContract);    
           
           // Save last processed block
           currentBlock = block.number+1;
       }
   })
},4000);

和測試:

 it('Aion contract calls returnBondsOnTimeOut()', async function() {

   await time.increase((await this.Escrow.suggestionDuration()).add(new BN ("1"))); 
       
   const executedCallEvents = await aionContract.getPastEvents("ExecutedCallEvent", 
       {fromBlock: "latest", toBlock:"pending"})
   
   await expectEvent.inLogs(executedCallEvents, 'ExecutedCallEvent', {})             
 })

您的測試包應該是完全獨立的。

將此事件生成嵌入到測試中,並將其與您的生產服務分離。

Truffle 套件被指定用於測試你的鏈上程式碼(合約)而不是你的鏈下程式碼。

引用自:https://ethereum.stackexchange.com/questions/89645