Solidity

如何讓 Hardhat 記錄返回的變數而不是整個交易收據?(用 TypeScript 編寫的測試)

  • December 17, 2021

fn()在返回變數的契約中有一個函式 。然後,我在用 TypeScript 編寫的 Hardhat 單元測試中測試所述函式的返回變數值。但是,當我console.log呼叫的輸出時fn(),它會記錄整個交易收據。

如果我隨後將函式更改為 aviewpure函式,它會記錄返回變數的實際值。問題是我需要測試該函式是否真的改變了狀態變數。我該如何補救?

記錄 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() 呼叫非常量合約方法來做到這一點。

希望能幫助到你!

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