在我们测试crud的时候,往往需要我们首先往数据库先初始化数据。使用seed可以帮助我们快速生成测试数据。
1.安装配置
执行命令pnpm add @mikro-orm/seeder,然后将配置写入配置文件
//mikro-orm.config.ts
import { SeedManager } from '@mikro-orm/seeder';
export default defineConfig({
// ...
extensions: [SeedManager],
})
2.通过Mikro-ORM Cli创建和seed相关的文件
将下面的配置写入配置文件中:
seeder: {
path: './src/seeders', // path to the folder with seeders
pathTs: undefined, // path to the folder with TS seeders (if used, you should put path to compiled files in `path`)
defaultSeeder: 'DatabaseSeeder', // default seeder class name
glob: '!(*.d).{js,ts}', // how to match seeder files (all .js and .ts files, but not .d.ts)
emit: 'ts', // seeder generation mode
fileName: (className: string) => className, // seeder file naming convention
},
3.使用CLI创建seed
执行命令npx mikro-orm seeder:create DatabaseSeeder # generates the class DatabaseSeeder
执行该条命令后,会在src目录下创建seeder文件夹(之前写在配置文件中),并创建DatabaseSeeder文件。接下来,把插入的逻辑全部写在其中的run中即可
4.创建实体工厂
安装fakerjs,用它来生成类中每个属性的值pnpm add @faker-js/faker -D。然后在seeders文件夹下创建文件TodoFactory.ts
import { Factory } from '@mikro-orm/seeder';
import { faker } from '@faker-js/faker';
import { Todo } from '../todos/entities/todo.entity';
export class TodoFactory extends Factory<Todo> {
model = Todo;
definition(): Partial<Todo> {
return {
title: faker.book.title(),
content: faker.lorem.text(),
isCompleted: faker.datatype.boolean(),
};
}
}
然后修改DatabaseSeeder中的内容,调用TodoFactory创建10条数据
import type { EntityManager } from '@mikro-orm/core';
import { Seeder } from '@mikro-orm/seeder';
import { TodoFactory } from './todoFactory.js';
export class DatabaseSeeder extends Seeder {
async run(em: EntityManager): Promise<void> {
new TodoFactory(em).make(10);
}
}
最后通过run方法,运行seed文件,npx mikro-orm seeder:run
fresh方法
一般来说,测试前需要将数据库原来的表删除,重新创建表插入数据。那么,难道需要我们删除原来的表,重新运行migration,然后在运行seed吗?
CLI中提供了命令npx mikro-orm migration:fresh --seed,可以将所有的数据库表都重置,然后执行所有的Migration计划,最后执行seeder