Automatizando la generación de datos ficticios con Seed, Factory, Faker y TypeORM en NestJS
Tags: spanish, nestjs, typeorm, seed
Published: 2023-03-31 22:47:43

## Introducción

En muchas ocasiones necesitamos generar datos ficticios para probar nuestro desarrollo o llenar nuestra base de datos de pruebas. La creación manual de estos datos puede resultar tediosa y llevar mucho tiempo. En este artículo, hablaremos sobre cómo automatizar el proceso de generación de datos ficticios utilizando TypeORM.

Para empezar es necesaria la instalación de una [extensión](https://typeorm-extension.tada5hi.net/) adicional ya que TypeORM por si solo no cuenta con una opción para generar datos ficticios.

```Shell
npm install --save @nestjs/typeorm typeorm typeorm-extension
```

Adicional a esto se requiere la instalación de un driver de conexión a la base de datos.

```Shell
npm install pg --save
```

En este caso se usará PosgreSQL por lo que realizamos la instalación del controlador recomendado por TypeORM en su [sitio](https://typeorm.io/#installation).

Para este ejemplo se tendrán dos entidades hipotéticas `user` y `post` .

Por último se hace la instalación de dependencias necesarias para la ejecución del código.

```Shell
npm install --save @nestjs/config @types/bcrypt bcrypt
```

Para el ejemplo se plantea la siguiente estructura de carpetas.

![Estructura de carpetas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5tns3nvubdyy40gkj3q.png)

## Definiendo un Factory

Un factory es una función que nos sirve para establecer una estructura u objeto con datos aleatorios ficticios en tiempo de ejecución. Con el uso de Faker podemos generar nombres, direcciones, números de teléfono, correos electrónicos y muchos otros tipos de datos ficticios.

En la definición de nuestro Factory se cuenta con una instancia de la librería Faker para generar datos aleatorios.

Por ejemplo, el archivo `user.factory.ts` contendría.

{% gist https://gist.github.com/ManuelGil/5673d0ba6df7f0cfdf94a785627a323e %}

Se puede encontrar más información acerca de Faker y sus características en [fakerjs.dev](https://fakerjs.dev/).

## Semilla o Seed

A través de un seed o semilla se puede generar un set de datos aleatorios, para ello se hace uso de una clase seeder que se apoya de un Factory para la creación de datos.

Lo podemos ver en el archivo `user.seeder.ts`.

{% gist https://gist.github.com/ManuelGil/1708dfc704b533e11223bb65b93e53dd %}

En el caso de la entidad post existe una relación que requiere de un usuario en la base de datos, por lo que se hace uso de un dato conocido para agregar esta relación, el archivo `post.seeder.ts` sería el siguiente.

{% gist https://gist.github.com/ManuelGil/44ad5daef19a4c30627f684f1548e530 %}

Para poder tener un mejor control de la ejecución del sets es importante definir un punto de entrada, el cual tiene el nombre `init.seeder.ts` por convención y será llamado en las configuraciones de TypeORM.

{% gist https://gist.github.com/ManuelGil/01032a3f5a524d84acad44bdc467a0a6 %}

## Configuración de TypeORM

Para este ejemplo se define un archivo `typeorm.config.ts` en el que se hace uso de las entidades, migraciones y seeds.

{% gist https://gist.github.com/ManuelGil/23e87a4b8aac58d16d1be5c26a8732fe %}

Esta configuración requiere de las variables de entorno por lo que se hace uso del `ConfigModule` .

En el archivo `.env` se deben actualizar las variables para la conexión a la base de datos.

```
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_USERNAME=postgres
DATABASE_PASSWORD=root
DATABASE_DATABASE=test
```

## Ejecución

Para ejecutar las migraciones y generación de datos aleatorios se agregan las configuraciones requeridas en el archivo `package.json`:

```JSON
"scripts": {
  ...
  "typeorm": "ts-node -r tsconfig-paths/register node_modules/typeorm/cli.js -d database/config/typeorm.config.ts",
  "mig-gen": "npm run typeorm migration:generate -- ",
  "mig-run": "npm run typeorm migration:run",
  "mig-rev": "npm run typeorm migration:revert",
  "seed": "ts-node -r tsconfig-paths/register node_modules/typeorm-extension/dist/cli/index.js seed -d database/config/typeorm.config.ts"
},
```

Para iniciar ejecutamos el comando `migration:generate` a través del atajo que se acaba de ingresar.

```Shell
npm run mig-gen -- database/migrations/init
```

Una vez creado el archivo con la migración inicial, corremos esta migración con el atajo de `migration:run`.

```Shell
npm run mig-run
```

Por último ejecutamos la semilla con el comando `seed`.

```Shell
npm run seed
```

Esto generaría un set de datos aleatorios con en la base de datos con el que podemos probar la aplicación.

El código completo de este ejemplo se encuentra publicado en [github](https://github.com/ManuelGil/nest-typeorm-seed-example) si desea descargarlo.

{% github ManuelGil/nest-typeorm-seed-example %}

## Conclusión

La generación de datos ficticios es una parte importante del desarrollo de aplicaciones. Utilizando Seed, Factory y Faker podemos automatizar este proceso y ahorrar mucho tiempo. Con estos tres elementos se puede generar grandes cantidades de datos ficticios de forma rápida y eficiente.