Pruebas de Smart Contracts en Hardhat con Chai y Ethers.js
Clase 21 de 24 • Curso de Dapps: Introducción al Desarrollo de Aplicaciones Descentralizadas
Resumen
¿Cómo escribir pruebas en Smart Contracts con Hardhat?
¡Bienvenido al fascinante mundo de las pruebas para Smart Contracts! Ahora que tienes tu Smart Contract de PlatziPunks con las funcionalidades completas, es crucial asegurarse de que todo funcione correctamente antes de avanzar al despliegue en una red de prueba. Vamos a enfocar nuestras energías en crear tests usando Hardhat y JavaScript, que son herramientas esenciales en este proceso.
¿Por qué es importante realizar pruebas?
Las pruebas son fundamentales para garantizar que nuestro Smart Contract funcione de manera adecuada y segura. Algunos beneficios importantes de realizar pruebas incluyen:
- Identificación de errores: Facilitan la detección de errores y malfuncionamientos antes de desplegar el contrato.
- Validación de funcionalidad: Aseguran que todas las funciones implementadas operen conforme a las expectativas.
- Mantenimiento de la calidad del código: Reducen el riesgo de errores futuros a medida que se hacen cambios o mejoras en el código.
¿Cómo empezar con las pruebas en Hardhat?
Para comenzar con las pruebas en Hardhat necesitas seguir algunos pasos iniciales:
- Preparación del entorno: Instalar las herramientas necesarias como Hardhat, y los plugins de Ethers.js si no lo has hecho aún.
- Crear el archivo de pruebas: Dentro de la carpeta de pruebas, crea un archivo
platzipunks.js
, donde escribirás todos los tests para tu contrato. - Importar las utilidades de Chai: Principalmente la función
expect
de Chai, que te ayudará a comparar los resultados reales con los esperados.
const { expect } = require("chai");
¿Cómo estructurar las pruebas?
Las pruebas generalmente se estructuran en suites que agrupan test relacionados. Usamos describe
para definir una suite de pruebas, mientras que it
define pruebas individuales.
Prueba de Max Supply
Vamos a crear una prueba básica para verificar que el max supply
funciona correctamente.
it("set max supply to pass param", async function () {
const maxSupply = 4000;
const { deploy } = await setup(maxSupply);
const returnedMaxSupply = await deploy.maxSupply();
expect(maxSupply).to.equal(returnedMaxSupply);
});
Aquí, nos aseguramos que el suministro máximo configurado en el contrato sea igual al que hemos pasado como parámetro.
Prueba de Minting
La siguiente prueba verifica que al ejecutar la función de mint
, se cree un nuevo token y se asigne al dueño del contrato.
it("mint a new token and assign it to owner", async function () {
const { deploy, owner } = await setup();
await deploy.mint();
const ownerOfMinted = await deploy.ownerOf(0);
expect(ownerOfMinted).to.equal(owner.address);
});
Esta prueba garantiza que el token mintado pertenece al dueño correcto.
Límite de Minting
Probamos también que no se muevan tokens más allá del límite del max supply.
it("has a minting limit", async function () {
const maxSupply = 2;
const { deploy } = await setup(maxSupply);
await Promise.all([deploy.mint(), deploy.mint()]);
await expect(deploy.mint()).to.be.revertedWith("PlatziPunks: max supply reached");
});
Esta prueba asegura que no se pueda crear más tokens una vez alcanzado el límite de max supply
.
Pruebas del token URI
Finalmente, es importante verificar que el token URI
retorna metadatos válidos.
describe("token URI", function () {
it("returns valid metadata", async function () {
const { deploy } = await setup();
await deploy.mint();
const tokenURI = await deploy.tokenURI(0);
const [prefix, base64JSON] = tokenURI.split('base64,');
const metadata = JSON.parse(Buffer.from(base64JSON, 'base64').toString('ascii'));
expect(metadata).to.include.keys('name', 'description', 'image');
});
});
Esto nos asegura que la metadata del token está correctamente formateada y contiene la información necesaria.
Recomendaciones finales
- Itera en tus pruebas: Usa este enfoque para probar todas las funcionalidades de tu contrato a medida que añades nuevas características.
- Documentación y plugins: Familiarízate con la documentación de Hardhat, Chai y Ethers.js para maximizar el uso de sus capacidades en tus pruebas.
Las pruebas continuas no solo fortalecen tu contrato, sino que también construyen una confianza sólida en el desenvolvimiento de tus recursos en la red. ¡Continúa experimentando y aprendiendo para mejorar cada vez más tus dApps y Smart Contracts!