saschati / yii2-muffin-factory
laravel factory 的端口
1.0.5
2021-01-14 19:56 UTC
Requires
- php: ^7.0 || ^8.0
- saschati/faker: ^1.9.4
- yiisoft/yii2: ~2.0.40
Requires (Dev)
- codeception/specify: ~1.0
- codeception/verify: ~1.0.0
- phpunit/phpunit: ~6.0
README
laravel factory 的端口,用于动态生成 fixtures 和数据库种子
安装
运行以下命令之一
composer require -dev insolita/yii2-muffin-factory:~1.0.0
或
"insolita/yii2-muffin-factory": "~1.0.0"
将以下内容添加到您的 composer.json
文件的 require-dev 部分中。
配置
在测试套件的 bootstrap 文件中添加(或在任何可以使用该工厂的应用中添加)
//with default factory path by alias @tests/factories Yii::$container->setSingleton( \insolita\muffin\Factory::class, [], [\Faker\Factory::create('en_EN')] ); //with custom factory path Yii::$container->setSingleton( \insolita\muffin\Factory::class, [], [ \Faker\Factory::create('ru_RU'), //Faker language '@common/data/factories' // Custom directory for factories ] );
创建工厂
您可以在单个文件中创建所有工厂,或者在工厂配置中定义的目录中的单独文件中创建工厂
例如 UserFactory.php
/** * @var \insolita\muffin\Factory $factory **/ $factory->define(User::class, function (\Faker\Generator $faker) { static $password; return [ 'name' => $faker->name, 'lastName' => $faker->name, 'email' => $faker->unique()->safeEmail, 'status'=>'default', 'passwordHash' => $password ?: $password = Yii::$app->security->generatePasswordHash('secret'), 'authKey' => Yii::$app->security->generateRandomString(), 'accessToken' => Yii::$app->security->generateRandomString(64), 'birthday' => $faker->date('Y-m-d', '-15 years'), 'registered' => $faker->dateTimeThisMonth()->format('Y-m-d H:i:s'), ]; }); $factory->state(User::class, 'developer', [ 'status' => 'developer', ]); $factory->state(User::class, 'client', [ 'status' => 'client', ]);
使用工厂
填充新记录而不保存
/**@var User $user **/ $user = factory(User::class)->make(); $user = factory(User::class)->states('client')->make(); /**@var User[] $user **/ $users = factory(User::class, 5)->make(); $users = factory(User::class, 5)->states(['client', 'developer'])->make();
填充并持久化记录
/**@var User $user * */ $user = factory(User::class)->create(); /**@var User[] $user **/ $users = factory(User::class, 10)->states(['client'])->create(['registered'=>Carbon::now()]);
在 FactoryTest 中查看更多示例
与 ActiveFixtures 一起使用
在配置目录中创建 ActiveFixture 扩展类,就像通常一样
class UserFixture extends ActiveFixture { public $modelClass = User::class; protected function getData() { return array_merge( factory(User::class, 1)->states('developer')->raw(), factory(User::class, 10)->states('client')->raw() ); } }
具有关系依赖的 fixtures
class PostFixture extends ActiveFixture { public $modelClass = Post::class; public $depends = [UserFixture::class]; public function load() { $this->data = []; $users = User::find()->select(['id'])->column(); foreach ($users as $userId) { $posts = factory(Post::class, 5)->create(['createdBy' => $userId]); foreach ($posts as $post) { $this->data[$post->id] = $post->getAttributes(); } } return $this->data; } } class SomeFixture extends ActiveFixture { public $modelClass = Some::class; public $depends = [UserFixture::class]; protected function getData() { $users = User::find()->select(['id'])->where(['status'=>'client'])->column(); $developer = User::find()->where(['status'=>'developer'])->limit(1)->one(); $data = array_merge( factory(Some::class, 5)->raw(['user_id'=>ArrayHelper::random($users)]), factory(Some::class, 20)->states('one')->raw(['user_id'=>function() use(&$users){ return ArrayHelper::random($users);}]), factory(Some::class, 11)->states('two')->raw(['user_id'=>$developer->id]) ); return $data; } }