0Pricing
Web3 & DApp Development Fundamentals · Lección

Redacción de pruebas

Mocha y Chai

Redacción de pruebas es una lección gratuita de Web3 & DApp Development Fundamentals en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Web3 & DApp Development Fundamentals, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Web3 & DApp Development Fundamentals incluye 4 lecciones en total.

Partes de esta lección aún no han sido traducidas y se muestran en inglés.

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.

  • describe groups related tests.
  • it defines a single test case.
  • expect makes 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 test

Hardhat 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 test

Async 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 with npx hardhat test.
  • Always await async contract calls.
  • getSigners + connect simulate different users.
  • On-chain numbers are BigInt; use parseEther/formatEther and beforeEach for clean setup.

Preguntas frecuentes

¿La lección «Redacción de pruebas» es gratis?

Sí — el texto completo de «Redacción de pruebas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Web3 & DApp Development Fundamentals, actualiza a CoddyKit PRO. El curso de Web3 & DApp Development Fundamentals incluye 4 lecciones en total.

¿Qué aprenderé en «Redacción de pruebas»?

Mocha y Chai Practicas Web3 & DApp Development Fundamentals con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Web3 & DApp Development Fundamentals?

No se requiere experiencia previa. Web3 & DApp Development Fundamentals en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Redacción de pruebas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Web3 & DApp Development Fundamentals?

Sí. Cada lección de Web3 & DApp Development Fundamentals incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Redacción de pruebas
  2. Pruebas de reverts y eventos
  3. Cobertura e informes de gas
  4. Fixtures
← Volver a Web3 & DApp Development Fundamentals