TypeORM 定着克力
依赖 伪造者.js,打字机固定-cli允许您创建一吨固定/假数据,用于开发或测试您的项目。 它为您提供了一些基本的工具,使得您能够非常容易地以可读和易于编辑的方式生成受约束的复杂数据,这样,您的团队中的每个人都可以在需要时来调整固定装置.
目录
安装
国家预防机制
npm install typeorm-fixtures-cli --save-dev
雅伦
yarn add typeorm-fixtures-cli --dev
开发设置
# install dependencies
npm install
# build dist files
npm run build
示例
fixtures/Comment.yml
entity: Comment
items:
comment{1..10}:
fullName: '{{name.firstName}} {{name.lastName}}'
email: '{{internet.email}}'
text: '{{lorem.paragraphs}}'
post: '@post*'
fixtures/Post.yml
entity: Post
items:
post1:
title: '{{name.title}}'
description: '{{lorem.paragraphs}}'
user: '@user($current)'
post2:
title: '{{name.title}}'
description: '{{lorem.paragraphs}}'
user: '@user($current)'
fixtures/User.yml
entity: User
items:
user1:
firstName: '{{name.firstName}}'
lastName: '{{name.lastName}}'
email: '{{internet.email}}'
profile: '@profile1'
__call:
setPassword:
- foo
user2:
firstName: '{{name.firstName}}'
lastName: '{{name.lastName}}'
email: '{{internet.email}}'
profile: '@profile2'
__call:
setPassword:
- foo
fixtures/Profile.yml
entity: Profile
items:
profile1:
aboutMe: <%= ['about string', 'about string 2', 'about string 3'].join(", ") %>
skype: skype-account>
language: english
profile2:
aboutMe: <%= ['about string', 'about string 2', 'about string 3'].join(", ") %>
skype: skype-account
language: english
创建固定线
这个库最基本的功能是将平面的 Yaml 文件变成对象
entity: User
items:
user0:
username: bob
fullname: Bob
birthDate: 1980-10-10
email: [email protected]
favoriteNumber: 42
user1:
username: alice
fullname: Alice
birthDate: 1978-07-12
email: [email protected]
favoriteNumber: 27
固定范围
第一步是让您创建许多对象的副本,以便去除 Yaml 文件的复制.
您可以在固定名称中定义一个范围:
entity: User
items:
user{1..10}:
username: bob
fullname: Bob
birthDate: 1980-10-10
email: [email protected]
favoriteNumber: 42
现在它将生成10个用户,其中ID用户1到用户10. 不错 但我们只有10个 名字、用户名和电子邮件 还不怎么漂亮.
定点参考
也可以指定一个参考,指以前创建的固定装置列表:
entity: Post
items:
post1:
title: 'Post title'
description: 'Post description'
user: '@user1'
固定列表
也可以指定一个数值列表,而不是一个范围:
entity: Post
items:
post{1..10}:
title: 'Post title'
description: 'Post description'
user: '@user($current)'
如果是范围(例如用户{1.10}), ($current) 将返回 1 用户, 2 用户等.
当前迭代可以作为字符串值 :
entity: Post
items:
post{1..10}:
title: 'Post($current)'
description: 'Post description'
Post($current) 将返回员额1,员额2等.
您可以使用基本的数学操作符来突变此输出 :
entity: Post
items:
post{1..10}:
title: 'Post($current*100)'
description: 'Post description'
Post($current*100) 将返回 Post 100 用于员额 1, Post 200 用于员额 2等.
调用同步和同步方法
有时虽然您需要调用一种方法来初始化一些更多的数据,但您可以像属性一样这样做,但使用方法名称并给出一系列参数.
entity: User
items:
user{1..10}:
username: bob
fullname: Bob
birthDate: 1980-10-10
email: [email protected]
favoriteNumber: 42
__call:
setPassword:
- foo
处理关系
entity: User
items:
user1:
# ...
entity: Group
items:
group1:
name: '<{names.admin}>'
owner: '@user1'
members:
- '@user2'
- '@user3'
如果您想要创建十个用户和十个组, 并且每个用户拥有一个组, 您可以使用 ($current) 当使用固定区域时,用每个迭代的当前编号替换:
entity: User
items:
user1:
# ...
entity: Group
items:
group{1..10}:
name: 'name'
owner: '@user($current)'
members:
- '@user2'
- '@user3'
如果您想要随机的用户而不是固定的用户,可以使用通配符定义引用:
entity: User
items:
user1:
# ...
entity: Group
items:
group{1..10}:
name: 'name'
owner: '@user*'
members:
- '@user2'
- '@user3'
或者说
entity: User
items:
user1:
# ...
entity: Group
items:
group{1..10}:
name: 'name'
owner: '@user{1..2}' # @user1 or @user2
members:
- '@user2'
- '@user3'
高级指南
参数
您可以设置全局参数, 这些参数将插入任何地方, 用于帮助可读性 。 例如:
entity: Group
parameters:
names:
admin: Admin
items:
group1:
name: '<{names.admin}>' # <--- set Admin
owner: '@user1'
members:
- '@user2'
- '@user3'
Faker 数据
此图书馆与 伪造者.js 图书馆。 使用QQfooQ可以调用Faker数据提供者生成随机数据.
让我们把静态的bob用户变成随机的条目:
entity: User
items:
user{1..10}:
username: '{{internet.userName}}'
fullname: '{{name.firstName}} {{name.lastName}}'
birthDate: '{{date.past}}'
email: '{{internet.email}}'
favoriteNumber: '{{datatype.number}}'
__call:
setPassword:
- foo
禁用标签
如果您需要使用字词 {{...}} 在定着器中(例如,Handlebars模板),可以禁用Faker处理:
每个固定 :
entity: EmailTemplate
disableFaker: true
items:
welcome:
subject: 'Welcome {{firstName}}'
body: 'Hello {{firstName}} {{lastName}}, welcome to {{companyName}}'
全球:
const parser = new Parser({ disableFaker: true });
const builder = new Builder(dataSource, parser, false);
EJS 调制
此图书馆与 EJS (英语)
entity: Profile
items:
profile1:
aboutMe: <%= ['about string', 'about string 2', 'about string 3'].join(", ") %>
skype: skype-account>
language: english
装入处理器
处理器允许您在对象被坚持之前和/或之后处理它们 。 处理者必须执行: IProcessor
import { IProcessor } from 'typeorm-fixtures-cli';
以下是一个例子:
processor/UserProcessor.ts
import { IProcessor } from 'typeorm-fixtures-cli';
import { User } from '../entity/User';
export default class UserProcessor implements IProcessor<User> {
preProcess(name: string, object: any): any {
return { ...object, firstName: 'foo' };
}
postProcess(name: string, object: { [key: string]: any }): void {
object.name = `${object.firstName} ${object.lastName}`;
}
}
固定配置 fixtures/user.yml
entity: User
processor: ../processor/UserProcessor
items:
user1:
firstName: '{{name.firstName}}'
lastName: '{{name.lastName}}'
email: '{{internet.email}}'
通用JS 的替代 Javascript语法
如果您需要运行CommonJS下的固定装置,并且使用加载处理器的打字程序有问题,这个替代示例应该为您工作:
processor/UserProcessor.js
class UserProcessor {
preProcess(name, obj) {
return { ...obj, firstName: 'foo' };
}
postProcess(name, obj) {
obj.name = `${obj.firstName} ${obj.lastName}`;
}
}
module.exports = { default: UserProcessor }
实体Schemas
如果您在打字机中使用实体Schemas, 您可能会遇到问题 __call 由于实体对象的构造方式,在打字机-固定中具有特性.
作为工作轮廓,您应该能够复制同样的方法功能 装入处理器 预处理方法(注意通过的对象将是普通对象,而不是你的实体对象).
使用量
Usage: fixtures load [options] <path> Fixtures folder/file path
Use -h or --help to show details of options: fixtures load -h
如果实体文件为打字符( 如 类型(中文(简体) )
这个 CLI 工具是用 Javascript 写成的, 要运行在节点上. 如果您的实体文件在打字符中, 在使用 CLI 之前, 您需要将其转换为 javascript 。 只需使用javascript即可跳过本节.
您可在您的工程中设置 ts- 节点, 以方便操作如下 :
安装 ts- 节点 :
npm install ts-node --save-dev
在 package.json 的脚本部分下添加打字机命令
"scripts": {
...
"fixtures": "fixtures-ts-node-commonjs"
}
关于无害环境管理项目,增加以下内容:
"scripts": {
...
"fixtures": "fixtures-ts-node-esm"
}
需要多个额外的模块
如果一次使用多个模块(如ts-node和tsconfig-paths) 您有能力要求这些模块带有多个需要的旗帜。 例如:
fixtures load ./fixtures --dataSource=./dataSource.ts --sync --require=ts-node/register --require=tsconfig-paths/register
程序装入固定装置
虽然打字机固定-cli是打算用作CLI,但仍然可以装入 在您的程序中通过 API 设置 .
例如,下面的代码片段会加载所有已存在于 ./fixtures 目录 :
import * as path from 'path';
import { Builder, fixturesIterator, Loader, Parser, Resolver } from 'typeorm-fixtures-cli/dist';
import { createConnection, getRepository } from 'typeorm';
import { CommandUtils } from 'typeorm/commands/CommandUtils';
const loadFixtures = async (fixturesPath: string) => {
let dataSource: DataSource | undefined = undefined;
try {
dataSource = await CommandUtils.loadDataSource(dataSourcePath);
await dataSource.initialize();
await dataSource.synchronize(true);
const loader = new Loader();
loader.load(path.resolve(fixturesPath));
const resolver = new Resolver();
const fixtures = resolver.resolve(loader.fixtureConfigs);
const builder = new Builder(connection, new Parser(), false);
for (const fixture of fixturesIterator(fixtures)) {
const entity: any = await builder.build(fixture);
await dataSource.getRepository(fixture.entity).save(entity);
}
} catch (err) {
throw err;
} finally {
if (dataSource) {
await dataSource.destroy();
}
}
};
loadFixtures('./fixtures')
.then(() => {
console.log('Fixtures are successfully loaded.');
})
.catch((err) => {
console.log(err);
});
样本
贡献者
代码贡献者
这个项目的存在要归功于所有作出贡献的人贡献[ [ ] [ ] ]. ].
财政捐助者
成为财政贡献者并帮助我们维持我们的社区贡献[ . ]
个人
组织
支持这个项目与你的组织。 你的标志会在这里出现 链接到你的网站。 [贡献[ . ]
麻省理工学院 伊戈尔·奥尼琴科