Solidity
測試呼叫非常量函式的函式
我在契約中有一個非常量函式:
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
。我想我應該
event
在OuterContract
函式中生成一個: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。