Solidity
如何讓 Hardhat 記錄返回的變數而不是整個交易收據?(用 TypeScript 編寫的測試)
我
fn()
在返回變數的契約中有一個函式 。然後,我在用 TypeScript 編寫的 Hardhat 單元測試中測試所述函式的返回變數值。但是,當我console.log
呼叫的輸出時fn()
,它會記錄整個交易收據。如果我隨後將函式更改為 a
view
或pure
函式,它會記錄返回變數的實際值。問題是我需要測試該函式是否真的改變了狀態變數。我該如何補救?記錄 tx 收據的函式:
fn() public returns(uint8) { uint8 numberLogged = 1; return numberLogged; }
記錄變數值的函式:
fn() public pure /*or view*/ returns(uint8) { uint8 numberLogged = 1; return numberLogged; }
單元測試:
import { FnContract } from "../typechain/FnContract"; describe("FnContract contract test", function () { let fnContract: FnContract; it("logs the output of fn()", async function() { const fnContractFactory = await ethers.getContractFactory("FnContract"); const accounts = await ethers.getSigners(); const accountOne = accounts[0]; const accountTwo = accounts[1]; fnContract = (await fnContractFactory.deploy()) as FnContract; const numberLogged = await fnContract.fn(); await numberLogged.wait(); console.log(numberLogged); })
最後,我目前正在學習 TypeScript,所以可能是我如何設置 TypeScript 測試文件?
不幸的是,不可能在鏈外獲得狀態改變函式的返回值。只有在呼叫您的合約的其他合約中才能將其上鍊。
通常所做的是您發出帶有所需數據的事件,並監聽這些事件。或者,您將所需的數據保存在契約中,並
view
呼叫另一個函式來返回數據。
contract.callStatic.METHOD_NAME( ...args [ , overrides ] ) ⇒ Promise< any >
與其執行事務的狀態更改,不如讓節點假裝呼叫不是狀態更改並返回結果。
這實際上不會改變任何狀態,並且可以用於從非常量合約方法中獲取返回值,方法是執行它,但不真正執行它。
對於參考 - > https://docs.ethers.io/v5/api/contract/contract/#contract-callStatic
在 truffle/web3 中,我們也可以通過使用 .call() 而不是 .send() 呼叫非常量合約方法來做到這一點。
希望能幫助到你!