Skip to main content

Factories

Formidable provides a simple way to generate fake data for your application using Faker. You can use this to create fake data for your Repositories or Tables, which is useful for testing and seeding your database.

Creating Factories​

You can create a factory using the make:factory Craftsman command. This will generate a new factory class in the database/factories directory.

node craftsman make:factory TaskFactory

This will create a new factory class named TaskFactory. You can then use this class to define fake data for the corresponding Repository or Table::

import {Factory} from '@formidablejs/framework'

export class TaskFactory extends Factory {
async definition(): Promise<any> {
return {
name: this.faker().lorem.sentence(),
description: this.faker().lorem.paragraph(),
completed: false,
}
}
}

Using Factories​

Factories can be used to create and insert records into your database.

Creating a Single Record​

await TaskFactory.factory().create()

Creating Multiple Records​

Use the count method to specify how many records to generate:

await TaskFactory.factory().count(10).create()

Resetting the Table​

You can reset the table before seeding data:

await TaskFactory.factory().reset().create()

This will delete all existing records before inserting new ones.

Using States​

States allow you to define different variations of the same factory. This is useful for representing different scenarios or states of a model.

Defining a State​

database/factories/TaskFactory.ts
import {Factory} from '@formidablejs/framework'

export class TaskFactory extends Factory {
async definition(): Promise<any> {
return {
name: this.faker().lorem.sentence(),
description: this.faker().lorem.paragraph(),
completed: false,
}
}

public completed() {
return this.state({
completed: true,
})
}
}

Using a State​

await TaskFactory.factory().completed().create()

This will create a task record with the completed field set to true.

Using Factories with Seeders​

You can use factories inside seeders to populate your database with test data:

database/seeders/DatabaseSeeder.ts
import {type Database} from '@formidablejs/framework'
import {TaskFactory} from '../factories/TaskFactory'

export const seed = async (DB: Database): Promise<void> => {
await TaskFactory.factory().reset().count(10).create()
}