Ссылка на запись фиксации в файлах данных yii2/codeception

Есть ли способ указать связанную строку другого прибора в файле данных прибора в Yii2/Codeception ActiveFixture? Рассмотрим этот пример отношения пользователя/профиля:

пользователь.php:

return [
    'user1' => [
        'email' => '[email protected]',
     ]
];

профиль.php:

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

В документации говорится, что «вы можете дать псевдоним строке, чтобы позже в тесте вы могли ссылаться на строку через псевдоним». Есть ли способ ссылаться на строки внутри другого прибора? Например, использовать что-то вроде $this->user('user1')->id в profile.php? Я не мог найти никаких упоминаний о том, как это сделать. Как вы создаете такие связанные приспособления?


person Andrey    schedule 18.12.2014    source источник


Ответы (2)


Доступ к псевдониму данных возможен только внутри области действия выделенного объекта 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',
     ]
];
person HongKilDong    schedule 12.01.2015

Я использую 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(),

];

профили.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 пользователей с профилями. Я надеюсь, что это поможет кому-то.

person Colohanin Nik    schedule 22.05.2015