ERC 20準拠の契約を展開します.第2部


これらのシリーズの最初の部分で、我々は作成して、ERC 20オープンZeppelin契約から継承している我々の最初の契約をまとめました.
このセクションでは、最初のテストの作成を開始します.TDDを試したことがない場合は、常に最初に、テストは通常、最初に来る.この場合、我々の最初のテストは、我々の契約が展開されたかどうかチェックするでしょう.なぜこのように働くのか?このアプローチは、あなたのプログラムの重要な機能が何であるかを考えることができますし、テストは、これらの機能が最終的に失敗する可能性がありますすべてのエッジケースを識別し、強さに役立つことができます私の経験を求めている.これらのテストは、新しい機能やエッジのケースをカバーするために時間と一緒に成長することができますし、何らかの方法であなたのプログラムの変更を行う必要がある場合、これらのテストはまだすべての機能がまだ動作することを確認します.スマート契約の場合、後者は適用するのがより困難です.メインネットで展開されたら、プロキシが変更されません(プロキシが現在のスコープを超えています).とにかく、スマート契約のこの不変性特性は、それを展開する前にあなたが本当にあなたの契約をテストするもう一つの理由であるでしょう.我々の最初のテストを書く十分な十分な理論.
端末でテストファイルを作成します.
touch test/glass-test.js
そして、我々はVSCでそれを開きます
code test/glass-test.js -r
HardhatではJavaScriptを使用しています(あるいは、私はnode . jsをもっと正確に言うべきでしょう)、私はtypescriptも利用できると思いますが、我々は前者を使用します.
空のファイルでこの最初の2行を書きます.
const { expect } = require("chai");
const { ethers } = require("hardhat");
あなたが私のようなJavaScriptに慣れていないならば(私の以前の経験はPythonのような言語であり、CのChorkとC +です).また、オブジェクトの破壊を使用して、このモジュールの唯一の特定の部分をインポートします.私は、あなたに本当に良い記事へのリンクをあなたにそれについてもう少し知りたいです
チャイはテストのための私達のライブラリであり、エーテルはEthereumのブロックチェーンと対話するために使用されるライブラリです.
それで、我々のテストを続けましょう.
describe("Glass Contract", function () {
  it("Should return our contract", async function () {
    const GlassContract = await ethers.getContractFactory("Glass");
    const glassContract = await GlassContract.deploy(21000000);
    await glassContract.deployed();

    expect(glassContract).to.exist;
  });
});
WOW(ここで文字通り)への多くのものへのWOW.私の経験のJavaScriptは、これらの入れ子になった関数がとても好きです.まず最初に、この関数はテストをグループ化するためのテストで使用されます.最初のパラメータは、テストしているオブジェクトの名前を付けた後、匿名関数式(JS linkの関数の型についての詳細ですが、この1つでゆっくり移動することを提案します)です.そして最後にそれは我々の個々のテストを含む機能.テストの中で、Etherライブラリを使用してファクトリを展開します.あなたが見ることができるように、我々は引数を提供しなければなりません、これは我々のトークンの我々の初期の供給を示しているパラメタです.
テストの内部で、我々のGlassContract変数がNULLでないか未定義であると予想しています.
まあ、それだけではない、まあ.おそらく、あなたは私が関数式の直前にそのasyncをスキップしているのに気がつきます、そして、内部は待ちます.これらのキーワードを使用すると、非同期になります.それはどういう意味ですか.さて、我々がここでしていることをちょっと考えてください、我々はネットワークで我々のスマート契約を展開しています、そして、我々は我々が我々がこの結果を得るまで、我々が待つこのキーワードですぐに結果を得ていなくて、我々が続けます.あなたが約束と非同期に慣れていないならば、このhereを見てください.
それで、我々は最終的に我々をしました.さて、テストしましょう(テストをテストしないとどうなるか).どうやってやるの?コンソールから、我々はこれをタイプします.
npx hardhat test test/glass-test.js
我々の端末のウィンドウでこのような何かを取得する必要があります
link
ここで起こることは少し説明しましょう.Hardhatは我々の契約を展開して、それから我々の契約がすでに存在することをテストします.しかし、どこで配備されましたか?まあHardHatローカルのネットワークでは、我々のテストのために調達され、後でシャットダウンしています.どのように便利ですね.
Hardhatはまた、すでに展開されたローカルネットワークやライブネットワークでそれを行うための選択を与える.しかし、少しの間我々のテストに戻りましょう.まず最初に、我々は本当にテストの前に我々の契約を作成するが、しかし、あなたは我々が逆でそれをすることができたという考えを得るので、我々は本当に特別にTDDをしませんでした、そして、それは本当のTDDです.その免責事項の後に少しテストを改善しようとしましょう.なぜなら、私たちは、NULLでないか定義されていない何かに入るという結論を得ることができるので、安全でなければならない強力なテストではありません.
const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("Glass", function () {
  it("Should return our contract", async function () {
    const GlassContract = await ethers.getContractFactory("Glass");
    const glassContract = await GlassContract.deploy(21000000);
    await glassContract.deployed();

    expect(glassContract).to.exist;
    expect(ethers.utils.isAddress(glassContract.address)).to.be.true;
  });
});
我々が現在テストしていることは、我々のGlassContractがアドレスを持っているということです、したがって、これで、我々は我々が我々の手で契約を持つことが安全であるために、もう少し近しいと思います.
しかし、私たちのコードを少し修正しましょう.今のところ我々は2つのテストをしています.
  it("Should return our contract", async function () {
    const GlassContract = await ethers.getContractFactory("Glass");
    const glassContract = await GlassContract.deploy(21000000);
    await glassContract.deployed();

    expect(glassContract).to.exist;
  });
  it("Should has an address", async function () {
    const GlassContract = await ethers.getContractFactory("Glass");
    const glassContract = await GlassContract.deploy(21000000);
    await glassContract.deployed();
   expect(ethers.utils.isAddress(glassContract.address)).to.be.true;
  });

VERBOSEがどのように我々のテストがちょうど自然言語にとても近いかについて注意してください、そして、このテストが我々のプログラム(このケースのスマート契約)が何をするかについて理解するために読むために意味されるので、それは完全に見つかります.しかし、何かが私を悩ましている、私たちのコードを少し強調しましょう.定義によるリファクタリングは、変更したり、外部の動作と機能を追加せずにコンピュータのコードを再構築のプロセスです.
この場合、ここで何をするのかというと、その部分を抽出していますが、その展開を繰り返しています(悪いことではありません.私たちは、それぞれのテストに対して新鮮な契約をしたいと思っています)、そして、コードを複製する必要がないことを正確にする機能の中に入れてください.
describe("Glass", function () {
  let glassContract;
  beforeEach(async function () {
    const GlassContract = await ethers.getContractFactory("Glass");
    glassContract = await GlassContract.deploy(21000000);
    await glassContract.deployed();
  });
  it("Should return our contract", async function () {
    expect(glassContract).to.exist;
  });
  it("Should has an address", async function () { expect(ethers.utils.isAddress(glassContract.address)).to.be.true;
  });
});
最初に見ることができるように、GlassContract変数を宣言して記述内のすべての関数のスコープで使用可能にし、各関数の前に各テストの前に実行する特殊関数を使用します.そこで、私たちがここでしたことは、2回目のテストを追加したときに、新しいテストを作成するたびにコードを繰り返す必要があることに気付きます.コードを変更する必要がある場合には、その関数内で実装を変更する必要があるように、繰り返しコードを関数の中に同封したことを避けるために、コードを毎回繰り返す必要があることに気付きました.それは基本的なレベルで我々はこのリファクタリングのプロセスを行うには我々のコードをより柔軟にし、新しい資金のための準備をしてください.
シリーズのこの2番目の部分を少しラップしましょう.JavaScript言語を使用して、我々の契約のテストを作成することを学ぶ.私たちはテストの進め方を学ぶ.そして最後に、我々は新たなニーズに備えるために、リファクタコードの避けられない段階を説明するためにいくつかの時間を捧げます.
次の記事では最終的にライブネットで契約を展開しますので、HardHatの準備方法を見てみましょう.いつものように、私はこれらのシリーズの結果をあなたに役立つように、彼らは私にしてください.