Solidity

Truffle 測試期間合約狀態不會改變

  • December 28, 2021

我正在嘗試使用 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

一個簡單的解決方案就在我的眼皮底下。顯然,我只需要閱讀給我的文件。

methods.myMethod.call

注意呼叫不能改變智能合約狀態

方法.myMethod.send

請注意,這可能會改變智能合約狀態

因此,對我的問題中最後一段測試程式碼的更改如下:

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

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