Не удалось импортировать эфиры через Hardhat, несмотря на официальную документацию по тестированию.
Согласно официальной тестовой документации Hardhat,
ethers
должен быть доступен неявно в глобальной области видимости; однако при желании это может быть
require
d явно, вот так:
const { ethers } = require("hardhat");
Это не подходит для моего местного проекта.
Манифест моего пакета, похоже, включает правильные зависимости:
{
"dependencies": {
"@nomiclabs/hardhat-ethers": "^2.0.1",
"@nomiclabs/hardhat-waffle": "^2.0.1",
"@openzeppelin/contracts": "https://github.com/OpenZeppelin/openzeppelin-contracts#v4.0.0-beta.0",
"chai": "^4.3.1",
"hardhat": "^2.0.11"
}
}
Мой файл модульных тестов также соответствует рабочему примеру в документации Hardhat:
const { ethers } = require("hardhat");
const { expect } = require("chai");
describe("Distributor.sol", function() {
it("Distribution should fail for non-owners", async function() {
const DistributorFactory = await ethers.getContractFactory("Distributor");
const Distributor = await Distributor.deploy();
Distributor.distribute([], []);
expect(await hardhatToken.totalSupply()).to.be.revertedWith("foobar");
});
});
Несмотря на это, выполнение тестов не удается:
$ yarn hardhat test
yarn run v1.22.5
$ /home/bob/dev/misc/token-distributor/node_modules/.bin/hardhat test
Distributor.sol
undefined
1) Distribution should fail for non-owners
0 passing (9ms)
1 failing
1) Distributor.sol
Distribution should fail for non-owners:
TypeError: Cannot read property 'getContractFactory' of undefined
at Context.<anonymous> (test/Distributor.js:8:49)
at processImmediate (internal/timers.js:461:21)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Как я могу это исправить?
3 ответа
Две вещи:
вам нужно установить
ethers
отдельно тоже, как указано в инструкции дляhardhat-ethers
, например
npm install --save-dev @nomiclabs/hardhat-ethers 'ethers@^5.0.0'
Каждый плагин Hardhat необходимо зарегистрировать в файле конфигурации Hardhat (
hardhat.config.js
):
require("@nomiclabs/hardhat-ethers");
Нет необходимости удалять явный импорт в вашем тестовом файле, однако в документации Hardhat рекомендуется следовать этому стилю:
const hre = require("hardhat);
const { ethers } = hre;
Добавьте требование в свой
hardhat.config.js
require("@nomiclabs/hardhat-waffle");
И удалите эту строку из тестового файла:
const { ethers } = require("hardhat");
Затем вы можете использовать в своих тестах. Прежде чем запускать тесты, Hardhat просматривает конфигурацию. Если вам нужен пакет, который включает
ethers
вы можете использовать его в глобальном масштабе.
Он все еще показывает ошибку,reading ethers undefined
, я снова начал проект сyarn hardhat
и выбрал первый вариант «Создать простой проект», и он отлично работает.