كتابة الاختبارات
Mocha وChai
كتابة الاختبارات درس مجاني في Web3 & DApp Development Fundamentals على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Web3 & DApp Development Fundamentals، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Web3 & DApp Development Fundamentals 4 دروس في المجموع.
بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.
Why Test Contracts
Smart contracts are immutable once deployed and often hold real value. A single bug can be unrecoverable, so thorough testing is essential.
- Catch logic errors before deployment.
- Document expected behavior.
- Guard against regressions when refactoring.
Mocha and Chai
Hardhat uses Mocha as the test runner and Chai for assertions, both included in the Toolbox.
describegroups related tests.itdefines a single test case.expectmakes assertions about values.
Tests live in the test/ folder.
A First Test File
A basic test imports ethers and Chai, then deploys and checks the contract:
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("Greeter", function () {
it("returns the initial greeting", async function () {
const Greeter = await ethers.getContractFactory("Greeter");
const greeter = await Greeter.deploy();
expect(await greeter.greeting()).to.equal("Hello, Hardhat");
});
});const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("Greeter", function () {
it("returns the initial greeting", async function () {
const Greeter = await ethers.getContractFactory("Greeter");
const greeter = await Greeter.deploy();
expect(await greeter.greeting()).to.equal("Hello, Hardhat");
});
});Running Tests
Run the whole suite with:
npx hardhat testHardhat compiles contracts first, spins up a fresh in-process network, and reports passing and failing tests. You can pass a path to run just one file.
npx hardhat testAsync and await
Almost every contract interaction is asynchronous because it talks to the network. Always await deployments and calls:
it("works", async function () {
const c = await Factory.deploy();
await c.waitForDeployment();
const value = await c.getValue();
expect(value).to.equal(0);
});Forgetting await is the most common cause of confusing test results.
it("works", async function () {
const c = await Factory.deploy();
await c.waitForDeployment();
const value = await c.getValue();
expect(value).to.equal(0);
});Common Chai Matchers
Chai gives expressive matchers for assertions:
.to.equal(x)— strict equality..to.be.true/.to.be.false— booleans..to.be.gt(n)— greater than..to.deep.equal([...])— array/object equality.
expect(await token.balanceOf(user)).to.equal(100);expect(await token.balanceOf(user)).to.equal(100);Working with Signers
getSigners returns test accounts you can use as different users:
const [owner, alice, bob] = await ethers.getSigners();
await token.connect(alice).transfer(bob.address, 50);connect(signer) sends the next call as that account, which is key for testing access control.
const [owner, alice, bob] = await ethers.getSigners();
await token.connect(alice).transfer(bob.address, 50);BigInt Values
Numbers on-chain are large integers. In ethers v6 they are JavaScript BigInt values. Compare them carefully:
const supply = await token.totalSupply();
expect(supply).to.equal(ethers.parseEther("1000"));Use parseEther and formatEther to convert between human and on-chain units.
const supply = await token.totalSupply();
expect(supply).to.equal(ethers.parseEther("1000"));Setup with beforeEach
Use beforeEach to deploy a fresh contract for every test, ensuring isolation:
let token;
beforeEach(async function () {
const Token = await ethers.getContractFactory("Token");
token = await Token.deploy();
});Each it then starts from a clean, identical state.
let token;
beforeEach(async function () {
const Token = await ethers.getContractFactory("Token");
token = await Token.deploy();
});Reading Test Output
A green checkmark means the test passed; a red cross with a diff shows what failed. Mocha prints the describe and it labels, so write descriptive names:
- Good:
it("reverts when caller is not owner") - Vague:
it("test1")
Running a Single Test
While developing you often want to focus on one test. Use Mocha's .only:
it.only("reverts when not owner", async function () {
// only this test runs
});You can also run a single file with npx hardhat test test/Token.js. Remember to remove .only before committing.
it.only("reverts when not owner", async function () {
// only this test runs
});Quick Check
Test your understanding of writing contract tests.
Recap
You learned to write contract tests.
- Hardhat uses Mocha (
describe/it) and Chai (expect). - Tests live in
test/and run withnpx hardhat test. - Always
awaitasync contract calls. getSigners+connectsimulate different users.- On-chain numbers are BigInt; use
parseEther/formatEtherandbeforeEachfor clean setup.
الأسئلة الشائعة
هل درس «كتابة الاختبارات» مجاني؟
نعم — نص درس «كتابة الاختبارات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Web3 & DApp Development Fundamentals، انتقل إلى CoddyKit PRO. تتضمن دورة Web3 & DApp Development Fundamentals 4 دروس في المجموع.
ماذا ستتعلم في «كتابة الاختبارات»؟
Mocha وChai تتمرن على Web3 & DApp Development Fundamentals مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Web3 & DApp Development Fundamentals؟
لا تُشترط خبرة سابقة. Web3 & DApp Development Fundamentals على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «كتابة الاختبارات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Web3 & DApp Development Fundamentals هذا؟
نعم. كل درس في Web3 & DApp Development Fundamentals يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كتابة الاختبارات
- اختبار حالات Revert والأحداث
- تقارير التغطية وGas
- التركيبات