我们先看一个简单的测试例子,然后拆开来讲每一行
const { expect } = require("chai");
describe("Token contract", function() {
it("Deployment should assign the total supply of tokens to the owner", async function() {
const [owner] = await ethers.getSigners();
const Token = await ethers.getContractFactory("Token");
const hardhatToken = await Token.deploy();
const ownerBalance = await hardhatToken.balanceOf(owner.address);
expect(await hardhatToken.totalSupply()).to.equal(ownerBalance);
});
});
先解释第一行,如果没有前段基础会看的很懵逼 。
此处我给一个前端的例子参考一下 :
// CommonJS模块 let { stat, exists, readFile } = require('fs'); // 等同于 let _fs = require('fs'); let stat = _fs.stat; let exists = _fs.exists; let readfile = _fs.readfile;
后面的第二行 都是固定写法 包括 describe ,it 等关键字
这里我们在说一个例子
例如,如果我们要测试此功能:
function helloWorld() { return 'Hello world!'; }
我们会像这样写一个jasmine测试规范:
describe('Hello world', () => { ① it('says hello', () => { ② expect(helloWorld())③.toEqual('Hello world!'); ④ }); });
说明:
- ①
describe(string, function)
函数定义了我们所谓的测试套件,它是各个测试规范的集合。 - ②
it(string, function)
函数定义了一个单独的测试规范,其中包含一个或多个测试期望。 - ③ 预计(实际)表达式就是我们所说的一个期望。它与匹配器一起描述应用程序中预期的行为片段。
- ④ matcher(预期)表达式就是我们所说的Matcher。如果传入的期望值与传递给Expect函数的实际值不符,则将布尔值与规范进行布尔比较。
我们回到我们的例子中:
ethers.js中的Signer
代表以太坊账户对象。
它用于将交易发送到合约和其他帐户。
ethers.js中的ContractFactory
是用于部署新智能合约的抽象,因此此处的Token
是用来实例代币合约的工厂。
在ContractFactory
上调用deploy()
将启动部署,并返回解析为Contract
的Promise
。 该对象包含了智能合约所有函数的方法。
ethers
变量在全局作用域下都可用。 所以呢 我们的第一个例子中没有加 const { ethers } = require("hardhat"); 也是正确的 ,加的话也可以。