Ethers.js

如何在用 TypeScript 編寫的安全帽測試中更改變數的範圍?

  • March 9, 2022

我正在嘗試使用 TypeScript 編寫安全帽測試,並且正在努力解決(從而訪問)某些變數的範圍。我提供了我正在努力解決的問題的簡化片段。

下面是有效的範例。在同一個單元測試中聲明和分配accountOne我需要它。但是,我需要在多個測試中使用該變數,因此我需要更改其範圍以在多個測試中可訪問。這樣我就可以避免一遍又一遍地重複相同的程式碼行。

import { ethers } from "hardhat";
import { Signer } from "ethers";

describe("Runs unit tests with Hardhat", () => {

   it("Logs accountOne's address from Hardhat", async () => {
       const [accountOne] = await ethers.getSigners();
       console.log(accountOne.address);
   });

})

before下面是我在鉤子的程式碼塊中聲明和分配它的嘗試。它不起作用,因為它是該塊的局部變數。(我也嘗試過使用beforeEach鉤子來獲得類似的結果。)但是,我已經使用 JavaScript 以這種方式完成了它,並且它以前工作過,所以我認為它可以與 TypeScript 一起工作。這記錄Cannot find name 'accountOne'.

import { ethers } from "hardhat";
import { Signer } from "ethers";

describe("Runs unit tests with Hardhat", () => {

   before(async () => {
       const [accountOne] = await ethers.getSigners();
   });

   it("Logs accountOne from Hardhat", () => {
       console.log(accountOne.address);
   });

})

accountOne下面是在單元測試中訪問的嘗試。我在describe程式碼塊中聲明它的類型為Signer,在鉤子中為其分配了一個值before,然後在我需要的單元測試中使用它。這是我最不確定的一個,因為我聲明accountOne為 type Signer,而簽名者最初是通過呼叫創建的ethers.getSigners()。這記錄Property 'address' does not exist on type 'Signer'.

import { ethers } from "hardhat";
import { Signer } from "ethers";

describe("Runs unit tests with Hardhat", () => {
   let accountOne : Signer;

   before(async () => {
       accountOne = await ethers.getSigners();
   });

   it("Logs accountOne from Hardhat", () => {
       console.log(accountOne.address);
   });
})

下面是我最近的嘗試,我accountOne在塊中聲明並分配了一個值describe,然後在單元測試中訪問它。這不會向控制台記錄任何內容。

import { ethers } from "hardhat";
import { Signer } from "ethers";

describe("Runs unit tests with Hardhat", async () => {
   const [accountOne] = await ethers.getSigners();

   it("Logs accountOne from Hardhat", () => {
       console.log(accountOne.address);
   });
})

我目前正在學習 TypeScript,所以我認為這就是問題所在。另外,因為我在用 JavaScript 編寫測試時沒有遇到這個問題。

正如我所懷疑的,聲明accountOne類型Signer是不正確的,而是我將其聲明為let accountOne : any在塊中,在describe塊中分配了一個值before,然後從單元測試中記錄它。因此,當我聲明它時,似乎我給了它錯誤的“類型”。鑑於我必須給它一個聲明時間的類型,我給它分配了any.

我知道它很舊並且您解決了它:) 您的聲明將在您的聲明中起作用(描述,它,之前,…)。即使您可以在外部聲明以使所有文件中的變數“全域”並在每個語句中訪問,例如:

let yourVar;

before("before", function(){
  // you can access here
})

describe("Context", function () {
  // you can access here
  it("test1", async function () {
     // you can acccess here
  }) 
})

在這種情況下,await ethers.getSigners()返回一個類型為 type 的數組SignerWithAddress,您可以使用@nomiclabs/hardhat-ethers/signers. 所以,你的聲明應該是:

import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers";

let account: SignerWithAddress;

希望讓其他有同樣問題的人更清楚:)

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