Есть ли способ указать связанную строку другого прибора в файле данных приборов в Yii2 / Codeception ActiveFixture? Рассмотрите этот пример отношения пользователь / профиль:
user.php:
return [
'user1' => [
'email' => '[email protected]',
]
];
profile.php:
use common\models\User;
return [
'profile1' => [
'user_id' => User::findOne(['email' => '[email protected]'])->id;
'name' => 'My Name',
]
];
В документации говорится, что «вы можете присвоить псевдоним строке, чтобы позже в вашем тесте вы могли ссылаться на строку через псевдоним». Есть ли способ ссылки на строки внутри другого прибора? Например, используйте что-то вроде $ this-> user (‘user1’) -> id в profile.php? Я не мог найти упоминания о том, как это сделать. Как вы создаете этот вид связанных светильников?
Доступ к данным с псевдонимами возможен только в пределах выделенного Fixture
объект через его data
собственность после ее load()
Метод был выполнен. Единственный способ сделать эти данные доступными из файла данных другого Fixture
объект должен зарегистрировать его в каком-то глобальном объекте, например Application
объект.
Я обычно просто запрашиваю все необходимые данные перед созданием зависимого набора данных:
use common\models\User;
$users = User::find()->indexBy('email')->all();
return [
'profile1' => [
'user_id' => $users['[email protected]']->id,
'name' => 'My Name',
]
];
Я использую Faker с Yii2.
Когда я начал писать тест, я обнаружил, что мне нужны хорошие светильники.
В yii2 есть yii2-faker / FixtureController, который может генерировать приборы.
Больше в документации
Но я получаю ту же проблему, что и автор. Мне нужно создать приспособления для пользователей, профилей (которые содержат user_id) и ролей. Я не нашел решения в документации, как это сделать, но эта работа для меня.
Шаблоны:
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.
Так что я мог знать, какой идентификатор будет у пользователя, и вставить его в профиль.
После этого я запускаю команду:
php yii fixture/generate users profiles --count=100
И сгенерировали 100 пользователей с профилями.
Надеюсь, это кому-нибудь поможет.