No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Generando Fake Books

20/27
Recursos

Aportes 10

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Código Comentado

  • Instalando la librería fakejs.dev
 ~/.../testing-js/api   master ●  npm install @faker-js/faker --save-dev
  • Agregando la regla a /testing-js/api/.eslintrc.js
  rules: {
    'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
  },
  • Configurando los parámetros deseados para nuestros casos.
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 };

  • Agregando la librería a los tests en /testing-js/api/src/services/books.service.test.js
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

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.

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
}
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.

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.

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.