引用yii2 / codeception数据文件中的fixture记录

时间:2014-12-18 10:33:58

标签: php yii2 fixtures codeception

有没有办法在Yii2 / Codeception ActiveFixture中的夹具数据文件中指定另一个夹具的相关行?考虑这个用户/配置文件关系的例子:

user.php的:

return [
    'user1' => [
        'email' => 'user1@example.net',
     ]
];

profile.php:

use common\models\User;
return [
    'profile1' => [
        'user_id' => User::findOne(['email' => 'user1@example.net'])->id;
        'name' => 'My Name',
     ]
];

文档说明"您可以为一行提供别名,以便在测试的后期,您可以通过别名引用该行。"有没有办法在另一个灯具内引用行?例如,在profile.php中使用类似$ this-> user(' user1') - > id的内容?关于如何做到,我找不到任何提及。你如何创造这种相关的装置?

2 个答案:

答案 0 :(得分:5)

在执行Fixture方法后,只能在专用data对象的范围内通过其load()属性访问别名数据。使这个数据可以从另一个Fixture对象的数据文件访问的唯一方法是将其注册到某个全局对象,例如Application对象。

我通常只是在构建依赖数据集之前查询所有需要的数据:

use common\models\User;
$users = User::find()->indexBy('email')->all();
return [
    'profile1' => [
        'user_id' => $users['user1@example.net']->id,
        'name' => 'My Name',
     ]
];

答案 1 :(得分:4)

我使用Faker和Yii2。 当我开始编写测试时,我发现我需要很好的固定装置。 在yii2中有yii2-faker / FixtureController,可以生成灯具。 More in documentation

但我和作者有同样的问题。我需要为用户,配置文件(包含user_id)和角色创建fixtures。我没有在文档中找到解决方案,如何做到这一点,但这对我有用。

模板: users.php

return [
'id' => $index +1 ,
'login' => $faker->unique()->safeEmail,
'password' => $user->hashPassword('123qwe'),
'type' => '0',
'is_active' => '1',
'is_verified' => '1',
'created_at' => time(),
'updated_at' => time(),

];

profiles.php

return [
'id' => $index +1 ,
'user_id' => $index +1 ,
'first_name' => $faker->firstName,
'last_name' => $faker->lastName,
'middle_name' => $faker->optional()->firstName,
'phone' => $faker->unique()->phoneNumber,
'contact_email' => $faker->email

];

这里的主要特征是 - $ index。

`$index`: the current fixture index. For example if user need to generate 3 fixtures for user table, it will be 0..2.

所以我可以知道用户的id是什么,并将其插入到个人资料中。

之后我运行命令:

php yii fixture/generate users profiles --count=100

已经为100个用户生成了个人资料。 我希望它有所帮助。