如何在用 TypeScript 編寫的安全帽測試中更改變數的範圍?
我正在嘗試使用 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
為 typeSigner
,而簽名者最初是通過呼叫創建的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;
希望讓其他有同樣問題的人更清楚:)