使用@nomiclabs/hardhat-waffle 实现装置

问题描述

在官方 waffle 文档中,您可能会找到下一个实现装置的方法

import {expect} from 'chai';
import {loadFixture,deployContract} from 'ethereum-waffle';
import BasicTokenMock from './build/BasicTokenMock';

describe('Fixtures',() => {
  async function fixture([wallet,other],provider) {
    const token = await deployContract(wallet,BasicTokenMock,[
      wallet.address,1000
    ]);
    return {token,wallet,other};
  }

  it('Assigns initial balance',async () => {
    const {token,wallet} = await loadFixture(fixture);
    expect(await token.balanceOf(wallet.address)).to.equal(1000);
  });

  it('Transfer adds amount to destination account',other} = await loadFixture(fixture);
    await token.transfer(other.address,7);
    expect(await token.balanceOf(other.address)).to.equal(7);
  });
});

但是,这在安全帽上使用插件时不起作用。插件文档中没有给出官方说明。

在下面回答。

解决方法

尽管您可以通过“Alt + 单击”每个变量自行找到解决方案,直到提出正确的类型结构,但最好使用以下代码段:

以下适用于 Typescript,如果您想在 javascript 上使用它,只需切换到使用“require()”导入以及摆脱类型:

    import {Wallet,Contract} from "ethers";
    import {MockProvider} from "ethereum-waffle";
    import {ethers,waffle} from "hardhat";
    const {loadFixture,deployContract} = waffle;


//Contract ABI
// For typescript only!
// In order to be able to import .json files make sure you tsconfig.json has set "compilerOptions" > "resolveJsonModule": true. My tsconfig.json at the bottom!
//For obvious reasons change this to the path of your compiled ABI

  import * as TodoListABI from "../artifacts/contracts/TodoList.sol/TodoList.json";

    //Fixtures
  async function fixture(_wallets: Wallet[],_mockProvider: MockProvider) {
    const signers = await ethers.getSigners();
    let token: Contract = await deployContract(signers[0],TodoListABI);
    return {token};
  }

然后,在你的 mocha-chai 测试中

it("My unit test",async function () {
    const {token} = await loadFixture(fixture);
    // Your code....
  });

我用于这个安全帽项目的 tsconfig.json

{
  "compilerOptions": {
    "target": "es2018","module": "commonjs","strict": true,"esModuleInterop": true,"outDir": "dist","resolveJsonModule": true
  },"include": ["./scripts","./test"],"files": ["./hardhat.config.ts"]
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...