Hardhat允许你使用Truffle来测试你的智能合约。 这主要因为兼容@truffle/contract
包与智能合约进行交互。
Truffle 4和Truffle 5分别使用@nomiclabs/hardhat-truffle4
和@nomiclabs/hardhat-truffle5
插件支持。 都能与Solidity 4+配合使用。
让我们来看看如何做到创建一个新的Hardhat项目。
运行这些开始:
mkdir my-project
cd my-project
npm init --yes
npm install --save-dev hardhat
现在在你的项目文件夹中运行npx hardhat
并选择创建一个空的hardhat.config.js
。
现在让我们安装Truffle
和Web3.js
插件,以及web3.js
本身。
npm install --save-dev @nomiclabs/hardhat-truffle5 @nomiclabs/hardhat-web3 web3
在你的Hardhat配置文件中引入并启用Truffle 5插件:
require("@nomiclabs/hardhat-truffle5");
module.exports = {
solidity: "0.7.3"
};
在项目中创建一个名为 contracts
的文件夹。 添加一个名为Greeter.sol
的文件,复制并粘贴下面的代码:
pragma solidity ^0.7.0;
contract Greeter {
string greeting;
constructor(string memory _greeting) {
greeting = _greeting;
}
function greet() public view returns (string memory) {
return greeting;
}
function setGreeting(string memory _greeting) public {
greeting = _greeting;
}
}
在项目根目录下新建一个名为 test
的目录,并创建一个名为 Greeter.js
的新文件。
我们先来看看下面的代码。 稍后将在下一步解释它,但现在只把代码粘贴到Greeter.js
中:
const Greeter = artifacts.require("Greeter");
// 传统的 Truffle 测试
contract("Greeter", accounts => {
it("Should return the new greeting once it's changed", async function() {
const greeter = await Greeter.new("Hello, world!");
assert.equal(await greeter.greet(), "Hello, world!");
await greeter.setGreeting("Hola, mundo!");
assert.equal(await greeter.greet(), "Hola, mundo!");
});
});
// Vanilla Mocha 测试,集成Mocha工具增强了兼容性
describe("Greeter contract", function() {
let accounts;
before(async function() {
accounts = await web3.eth.getAccounts();
});
describe("Deployment", function() {
it("Should deploy with the right greeting", async function() {
const greeter = await Greeter.new("Hello, world!");
assert.equal(await greeter.greet(), "Hello, world!");
const greeter2 = await Greeter.new("Hola, mundo!");
assert.equal(await greeter2.greet(), "Hola, mundo!");
});
});
});
正如你在第一行中所看到的,artifacts对象存在于全局作用域中,你可以使用它来访问Truffle合约抽象。
const Greeter = artifacts.require("Greeter");
这个例子显示了两种测试方法:
contract()
,这是Truffle的传统测试方法。describe()
, 这是使用Mocha进行测试的传统方式。Truffle用Mocha来运行测试,但一些集成Mocha的工具并不兼容 contract()
,因此不总是能很好地工作。 我们建议使用describe()
方法。
你可以通过运行npx hardhat test
来运行这些测试。:
$ npx hardhat test
Contract: Greeter
✓ Should return the new greeting once it's changed (265ms)
Greeter contract
Deployment
✓ Should deploy with the right greeting (114ms)
2 passing (398ms)
如果你想使用Truffle Migrations来初始化你的测试,并在合约抽象上调用deployed()
,@nomiclabs/hardhat-truffle4
和@nomiclabs/hardhat-truffle5
都提供了附加固件功能来实现它。 请看Truffle迁移指南了解更多。
要在测试中使用Web3.js,它的一个实例在全局范围内是可用的。 你可以在sample-test.js
中的describe()
测试中看到这一点:
const Greeter = artifacts.require("Greeter");
// Traditional Truffle test
contract("Greeter", accounts => {
it("Should return the new greeting once it's changed", async function() {
const greeter = await Greeter.new("Hello, world!");
assert.equal(await greeter.greet(), "Hello, world!");
await greeter.setGreeting("Hola, mundo!");
assert.equal(await greeter.greet(), "Hola, mundo!");
});
});
// Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
describe("Greeter contract", function() {
let accounts;
before(async function() {
accounts = await web3.eth.getAccounts();
});
describe("Deployment", function() {
it("Should deploy with the right greeting", async function() {
const greeter = await Greeter.new("Hello, world!");
assert.equal(await greeter.greet(), "Hello, world!");
const greeter2 = await Greeter.new("Hola, mundo!");
assert.equal(await greeter2.greet(), "Hola, mundo!");
});
});
});
查看该插件的 README file f以获取更多相关信息。