Fixture для has one relation

Всё про тестирование в Yii 2.0
Ответить
Аватара пользователя
NeverDie
Сообщения: 70
Зарегистрирован: 2012.05.13, 04:05
Откуда: Минск
Контактная информация:

Fixture для has one relation

Сообщение NeverDie »

Здравствуйте!
Есть 2 таблицы
user (id, ..) profile (user_id, ..). Связаны через foreign key.
Создаю для них фикстуры.

Код: Выделить всё

class ProfileFixture extends \yii\test\ActiveFixture
{

    public $modelClass = Profile::class;
    public $dataFile = __DIR__ . '/data/profile.php';
    public $depends = [
        \app\modules\user\tests\fixtures\UserFixture::class
    ];

}
//Файл profile.php
return [
    [
        'user_id'   => 100,  //Как получить id из таблицы user?
        'firstname' => 'test',
        'lastname'  => '',
    ]
];


Код: Выделить всё

class UserFixture extends \yii\test\ActiveFixture
{

    public $modelClass = User::class;
    public $dataFile = __DIR__ . '/data/user.php';

}

//Файл user.php
return [
    [
        'id'           => 100,
        'email'        => 'test@test.com',
    ]
];
В console.php подключаю так:

Код: Выделить всё

'fixture' => [
            'class'          => \yii\console\controllers\FixtureController::class,
            'globalFixtures' => [
                'yii\test\InitDbFixture',
            ],
        ],

Как получить id в связанной фикстуре (profile.php) ?
spinik
Сообщения: 15
Зарегистрирован: 2020.11.24, 17:03

Re: Fixture для has one relation

Сообщение spinik »

тоже с этим столкнулся и сам ищу ответ
spinik
Сообщения: 15
Зарегистрирован: 2020.11.24, 17:03

Re: Fixture для has one relation

Сообщение spinik »

У меня получилось вот так.
В самом тесте я подключаю фикстуры каскадно :

Код: Выделить всё

	public function _fixtures() {
		return [
			'offices'				 => ['class' => OfficeFixture::class],
			'admin'				 => ['class' => SystemAdminFixture::class],
			'supervisor'			 => ['class' => SupervisorOneCAFixture::class],
			'not_active_employee'	 => ['class' => NotActiveemployeeFixture::class],
		];
	}
И я знаю что в базу первыми попадут данные для офисов, а только потом подключаться пользователи. В самой записи пользователя есть ссылка на офис.
Для записи пользователя нужно получить id_office
В data file пользователя я делаю так:

Код: Выделить всё

'id_office'=>Office::find()->select('id')->where(['name' => TEST_OFFICES['office_name'])->scalar()
TEST_OFFICES это константа в test_data.php.
test_data.php это конфигурационный файл, где я описываю какие имена должны иметь офисы, какие логина должны иметь юзеры и так далее
Ответить