Introducción a Unit Testing con Jest + Enzime para ReactJs.
¿Es realmente necesario testear nuestros componentes antes de salir a producción? Definitivamente!. Esto te evitará problemas a futuro, gracias al control de las respuestas de nuestros componentes en el DOM, ganarás confianza y a la vez te sentirás más tranquilo a la hora de programar junto a tu equipo.
Estableciendo unas simples reglas, el camino de desarrollo a producción será mucho más sencillo y llevadero.
La presentación abarca desde la configuración de nuestras librerías hasta la creación de Mocks y Snapshots.
Saludos y que lo disfruten!
Gabriel Comas - Desarrollador Front End.
2. ¿Qué es Unit Test y para que sirve?
Es lo que permite llevar un control, a menor escala,
de los componentes para que estos cumplan con
nuestras expectativas.
CLICK ME
Resultado final:
Click Me
Expectativa:
3. Beneficios
Nuestro código cumple un standard.
Ocurren menos errores en la etapa de producción.
Genera confianza a la hora de programar.
5. Características de Jest
// No necesita demasiada configuración adicional.
// Tests UI de forma rápida y ágil.
// Pruebas individuales, pueden isolarse.
// Genera reportes del porcentaje de la app testeada.
// Posee gran cantidad de documentación.
// Cuenta con una comunidad activa.
6. Instalación y configuración
// Buenas prácticas
Cada componente debe tener su carpeta __test__
Todos los archivos de test debe tener la siguiente estructura
// ejemplo.test.js
npm install --save-dev jest
"scripts": {
"test": "jest --verbose"
},
npm run test
// package.json
7. Estructura
test("Descripción del test", () => {
expect(elemento a testear).verbo()
})
test("It should has React", () => {
const frameworks = ["React", "Vue", "Angular",
"Svelte"];
expect(frameworks).toContain("React"); });
// Ejemplo
8. // Test arrays
test("It should has React", () => {
const frameworks = ["React", "Vue", "Angular", "Svelte"];
expect(frameworks).toContain("React"); });
// Test numbers
test("It should be greater than", () => {
expect(10).toBeGreaterThan(9); });
// Test Booleans
test("It should be true", () => { expect(true).toBeTruthy(); });
// Reverse strings function
const reverseString = (str, cb) => {
cb(str.split("").reverse().join("")); };
// Test callbacks
test("The callback should return a reversed word", () => {
reverseString("Platzi", str => { expect(str).toBe("iztalP"); }); });
10. Describe – Agrupar tests
describe("Test group", () => {
test("It should has React", () => {
const frameworks = ["React", "Vue",
"Angular", "Svelte"];
expect(frameworks).toContain("React");
});
test("It should be greater than", () => {
expect(10).toBeGreaterThan(9);
});
});
11. Test individual
// Correr el test de un archivo en particular
// package.json
Watch
// Escucha los test y los ejecuta cuando ocurre un cambio en los mismos
"scripts": {
"test": "jest --verbose",
"test:watch": "jest --watch"
},
npm run test:watch
npm install -g jest
jest src/__test__/index.test.js
14. ¿Qué ofrece Enzyme?
Mount() Shallow()
Realiza un render en el DOM
del componente.
Permitiéndonos testear
interacciones del usuario
(eventos).
Solo necesitas algo
particular del componente.
Al no necesitar el DOM,
el test es rápido.
15. Configuración
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() });
// setupTest.js
"jest": {
"setupFilesAfterEnv": [
"<rootDir>/src/__test__/setupTest.js"
]
}
// package.json
A diferencia de un test integral, que es el test que se genera sobre un conjunto de funcionabilidades, o un test E2E, que hace lo mismo, pero utilizando un escenario real, con sus servicios.
Establece una regla para componentes que no cambian normalmente, sin logica, y que representa una estructura visual
Se instala “react-test-renderer” ya que se necesita convertir el component a un objeto JSON para hacer el Snapshot
Establece una regla para componentes que no cambian normalmente, sin logica, y que representa una estructura visual
Para hacer fetch hay que instalar el mock de fetch y agregarlo a la configuracion
Para hacer fetch hay que instalar el mock de fetch y agregarlo a la configuracion