Solidity
Truffle 測試期間合約狀態不會改變
我正在嘗試使用 Truffle 套件和 Ganache 來測試我的契約。
到目前為止,我一直在測試僅限於的合約功能
view
。現在,當我嘗試更改合約狀態時,我發現狀態實際上並沒有在函式呼叫之間發生更改。考慮以下簡單的合約:
pragma solidity ^0.4.24; import "../OrderBook.sol"; contract IdManager { uint256 newId; function addId() public returns (uint256) { newId++; return newId; } }
我想做的就是增加
newId
並返回它的新值。我為測試而編寫的程式碼是:
const { getWeb3, getContractInstance, parseSignature } = require("./test_helper"); const web3 = getWeb3(); const getInstance = getContractInstance(web3); contract('IdManager', (accounts) => { let IdManager = getInstance('IdManager'); it('test addId()', async () => { console.log(await IdManager.methods.addId().call()); console.log(await IdManager.methods.addId().call()); console.log(await IdManager.methods.addId().call()); }); });
該
getInstance()
呼叫正在使用Web3 v1.0
,基於本教程。通過上述測試,我希望輸出為:
1 2 3
但是,我實際上得到:
1 1 1
有沒有人遇到過這個問題?
編輯0:
console.log(await IdManager.methods.newId().call());
應該是console.log(await IdManager.methods.addId().call());
——newId()
現在是addId()
。編輯1:
接受 goodvibration 的建議,我將範例合約修改為如下:
contract IdManager { uint256 public newId; function addId() public { newId++; } function getId() public view returns (uint256) { return newId; } }
測試程式碼已更改為以下內容:
it('test addId()', async () => { await IdManager.methods.addId().call(); console.log(await IdManager.methods.getId().call()); await IdManager.methods.addId().call(); console.log(await IdManager.methods.getId().call()); await IdManager.methods.addId().call(); console.log(await IdManager.methods.getId().call()); });
不幸的是,我的輸出仍然顯示狀態沒有被保留:
0 0 0
一個簡單的解決方案就在我的眼皮底下。顯然,我只需要閱讀給我的文件。
注意呼叫不能改變智能合約狀態。
請注意,這可能會改變智能合約狀態。
因此,對我的問題中最後一段測試程式碼的更改如下:
it('test addId()', async () => { await IdManager.methods.addId().send({from: accounts[0]}); console.log(await IdManager.methods.getId().call()); await IdManager.methods.addId().send({from: accounts[0]}); console.log(await IdManager.methods.getId().call()); await IdManager.methods.addId().send({from: accounts[0]}); console.log(await IdManager.methods.getId().call()); });
這導致了我想要的輸出:
1 2 3