Generando Fake Books
Clase 20 de 27 • Curso de Introducción al Testing con JavaScript
Contenido del curso
Clase 20 de 27 • Curso de Introducción al Testing con JavaScript
Contenido del curso
Edgar Mauricio Pérez Rojas
Ronaldo Delgado
Angel Hernandez
Carlos Nicolas Gonzalez Cabrera
Miguel Angel Reyes Moreno
Irving Juárez
Brandon Argel Verdeja Domínguez
Wilson Bienvenido Otaño Mateo
Roberto Contrera
Johnner Alexander Gambacica Ortiz
Cesar Buelvas Torres
Dago Garcia Leon
Ronald Amiquero Zoiqui
Agustina Corvo
Anthony Hernando Rivera Escobar
Agustina Corvo
jesus manuel vergara arias
Camilo Alvarez Avila
Ronaldo Delgado
Beto Toro
Código Comentado
~/.../testing-js/api master ● npm install @faker-js/faker --save-dev
rules: { 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], },
const { faker } = require('@faker-js/faker'); const generateOneBook = () => ({ _id: faker.datatype.uuid(), name: faker.commerce.productName(), price: faker.commerce.price(), }); const generateManyBook = (size) => { const limit = size ?? 10; // Si no me envian el tamaño genero 10 libros. const fakeBooks = []; // Colocando los fakeBooks generados. for (let index = 0; index < limit; index += 1) { fakeBooks.push(generateOneBook()); } return [...fakeBooks]; }; module.exports = { generateOneBook, generateManyBook };
const { generateManyBook } = require('../fakes/book.fake'); const BooksService = require('./books.service'); // Data de relleno preparada. // Esta responsabilidad pasa a la librería fakejs.dev y se llama en el test unitario. /* const fakeBooks = [ { _id: 1, name: 'Harry Potter 2', }, ]; */ // Para hacer pruebas de comportamiento se usa jest.fn(). // se cambia el nombre de spy a Mock para que el jest lo interprete bien. const mockGetAll = jest.fn(); // Suplantación de la BD. jest.mock('../lib/mongo.lib', () => jest.fn().mockImplementation(() => ({ // Metodos a suplantar. getAll: mockGetAll, // Directo, sin fake y sin => function. // getAll: () => [...fakeBooks], // "data enlatada" create: () => {}, }))); describe('Test for BooksService', () => { let service; beforeEach(() => { service = new BooksService(); // Limpiar los Mocks antes de cada caso para no dejar relleno del anterior. jest.clearAllMocks(); }); describe('test for getBooks', () => { test('should return a list book', async () => { // Arrange const fakeBooks = generateManyBook(20); mockGetAll.mockResolvedValue(fakeBooks); // Act const books = await service.getBooks({}); console.log(books); // Assert expect(books.length).toEqual(fakeBooks.length); // Espiando expect(mockGetAll).toHaveBeenCalled(); // Para saber si fué llamado expect(mockGetAll).toHaveBeenCalledTimes(1); // cuantas veces es llamado expect(mockGetAll).toHaveBeenCalledWith('books', {}); // Con qué argumentos fué llamado. }); test('should return a list book', async () => { // Arrange const fakeBooks = generateManyBook(4); mockGetAll.mockResolvedValue(fakeBooks); /* [{ _id: 1, name: 'Harry Potter 3', }]); */ // Act const books = await service.getBooks(); console.log(books); // Assert expect(books[0].name).toEqual(fakeBooks[0].name); }); }); });
Nota: Empecé con Harri Potter 2
Genial!
Consejo super pro, siempre lean la documentacion de las API's, algunas veces pueden deprecar la forma en la que se consume la data de la API, aparte que leer la documentacion ayuda mucho en el mundo real.
En lugar de poner "_id: faker.datatype.uuid()," se recomienda poner "_id: faker.string.uuid()," ya que en su nueva versión esto estara deprecado, les avisara en consola de todas maneras.
Me encanta las buenas prácticas y la organización de Nico en su código, se nota que tiene muchísima experiencia
Esta manera de crear los fake books me parece mejor, donde getSingleBook es la funcion createOneBook
const getBooks = (size = 10) => { const books = new Array(size) .fill({}) .map(_book => getSingleBook()) return books }
Además del cambio por faker.string.uuid(), si instalan la última versión de@faker-js/faker (de la versión 10 en adelante), ésta ya no soporta CJS, solo ESM. Por lo que hay dos opciones para solucionarlo:
npm i -D @faker-js/faker@9 y seguir trabajando con CJS."type": "module" al package.jsonrequire(...) por import ... from ...module.exports por exportPor si hay alguien nuevo, actualmente la forma de hacer los uuid es
id: faker.string.uuid() ```en lugar de usar ```js faker.datatype.uuid()
¿Por qué utiliza doble () => () => {...}? No llega a lo mismo con uno que sería () => {...}
Excelente clase, y herramientas. Ahora me siento super bien con unit testing, jest y faker.js =)
Con lo que pasó con faker, ahora uso falso. https://github.com/ngneat/falso
npm i @ngneat/falso --save-dev
Es mas o menos los mismo, para pruebas y migraciones está bien.
En el 2026 me funciono de la siguiente manera.
Haz clic derecho en tu carpeta Api -> New File -> y Llámalo babel.config.js y pega este código
module.exports = {
presets: [
['@babel/preset-env', { targets: { node: 'current' } }]
],
};
Ahora crea otra carpeta así mismo pero le pones jest.config.js y pegas este código.
module.exports = {
testEnvironment: 'node',
transformIgnorePatterns: [
"node_modules/(?!@faker-js)"
]
};
Esto le enseña a Jest cómo traducir código moderno y también le dices NO ignores a la librería faker, tradúcela también.
Una consulta: ¿Cuál es la diferencia entre datos fakes y datos Dummy?
Son parecidos ya que ambos son datos falsos que se crean al generar pruebas. La diferencia es que la idea de un dato fake es que sea lo más cercano posible al mundo real y un dummy no.
Si estas llevando este curso en el 2025 cambia uui por esto : _id: faker.string.uuid(),
Si se fijan en la documentación de la API además de que datatype.uuid() ahora es string.uuid(), se puede usar book.title() en vez de commerce.productName() para que tengan más sentido los datos fake.
La única manera en la que me funcionó el mocking data de faker para el id fue con string:
const generateOneCothe = () => { return { _id: faker.string.uuid(), product: faker.commerce.productName(), price: faker.commerce.price(), brand: faker.commerce.productAdjective(), }; }; const generateCothes = (count) => { const limit = count || 10; const result = []; for (let i = 0; i < limit; i++) { result.push(generateOneCothe()); } return [...result]; }; ```const generateOneCothe = () => { return { \_id: faker.string.uuid(), product: faker.commerce.productName(), price: faker.commerce.price(), brand: faker.commerce.productAdjective(), };}; const generateCothes = (count) => { const limit = count || 10; const result = \[]; for (let i = 0; i < limit; i++) { result.push(generateOneCothe()); } return \[...result];};
Me estaba generando error cuando le decia : _id: faker.datatype.uuid(),
Entonces lo cambie por : _id: faker.string.uuid(),
Entendí que era porque 'faker.datatype.uuid' ya esta deprecado
increíble esta herramienta, es muy útil!
El autro de esta librería se puso un poco loco y daño apropósito la librería como forma de protesta. Así que no les recomiendo utilizar Faker.js. Busquen la historia en google que se van a sorprender con tremenda novela.