Solidity

測試呼叫非常量函式的函式

  • January 30, 2018

我在契約中有一個非常量函式:

contract InnerContract {
   event Event(uint256);

   function func(uint256 val) external returns (uint256) {
       Event(val);
       return val;
   }
}

它是從另一個合約中的函式呼叫的:

import './InnerContract.sol';

contract OuterContract {
   InnerContract pInnerContract;

   function func(uint256 val) external returns (uint256) {
       return pInnerContract.func(val) + 1;
   }
}

我正在嘗試通過以下腳本在松露中對其進行測試:

contract('Test', () => {
   let hInnerContract;
   let hOuterContract;

   before(async () => {
       hInnerContract = await artifacts.require("InnerContract.sol").new();
       hOuterContract = await artifacts.require("OuterContract.sol").new();
   });

   describe('test:', async () => {
       let input = 1;
       it(`expected output = ${input + 1}`, async () => {
           try {
               let hash = await hOuterContract.func(input);
               let output = Number(hash.receipt.logs[0].data);
               assert(output == input + 1, `actual output = ${output}`);
           }
           catch (error) {
               assert(false, error.message);
           }
       });
   });
});

但是,問題出在hash.receipt.logs[0].data.

它包含函式中event生成的值InnerContract

我想我應該eventOuterContract函式中生成一個:

contract OuterContract {
   event Event(uint256);
   InnerContract pInnerContract;

   function func(uint256 val) external returns (uint256) {
       uint256 val2 = pInnerContract.func(val) + 1;
       Event(val2);
       return val2;
   }
}

但是當我這樣做時,我在松露中得到以下異常:

Uncaught TypeError: Cannot read property 'constructor' of undefined
at C:\Users\...\cli.bundled.js:316118:19
at Array.forEach (<anonymous>)
at C:\Users\...\cli.bundled.js:316114:32
at Array.map (<anonymous>)
at Object.decodeLogs (C:\Users\...\cli.bundled.js:316067:19)
at Object.callback (C:\Users\...\cli.bundled.js:316195:35)
at C:\Users\...\cli.bundled.js:37985:25
at C:\Users\...\cli.bundled.js:328869:9
at C:\Users\...\cli.bundled.js:324536:9
at XMLHttpRequest.request.onreadystatechange (C:\Users\...\cli.bundled.js:327565:7)

順便說一句,在此異常發生之前,truffle 表明這兩個事件確實已發出:

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

Event(: 1)
Event(: 2)

---------------------------

你能解釋一下我在這裡做錯了什麼嗎?

謝謝!!!

似乎Uncaught TypeError: Cannot read property 'constructor' of undefined可以通過在每個事件中“命名”匿名變數來解決異常。

換句話說,改變每一次出現:

event Event(uint256);

對於這樣的事情:

event Event(uint256 x);

出於某種原因,“匿名事件”僅在發出單個事件時才有效。

如果我理解正確,您有一個帶有函式名稱的內部合約func,它只返回一個值和一個覆蓋相同函式的**外部合約。**外部合約的func呼叫func內部合約的 並將返回值加 1。

部署內部合約

contract InnerContract {
   function func(uint256 val) external returns (uint256) {
       return val;
   }
}

設內部合約地址為:0xdc04977a2078c8ffdf086d618d1f961b6c546222

使用以下程式碼部署外部合約:

pragma solidity ^0.4.18;
contract InnerContract {
   function func(uint256 val) external returns (uint256) {
   }
}

contract OuterContract is InnerContract{
   InnerContract pInnerContract = InnerContract(0xdc04977a2078c8ffdf086d618d1f961b6c546222);
  function func(uint256 val) external returns (uint256) {
       return  pInnerContract.func(val) + 1;
   }
}

現在,當您使用值 1 進行校準func_outer時。返回值為 2。

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