#php #yii2
#php #yii2
Вопрос:
У меня есть модель, использующая Blameable
поведение:
class Vehicle extends ActiveRecord
{
// ...
public function behaviors()
{
return [
'blameable' => [
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'UserID',
'updatedByAttribute' => null,
]
];
}
// ...
}
Проблема в том, что когда я пытаюсь сохранить экземпляр Vehicle
для тестирования с определенным идентификатором пользователя, Blameable
он переопределяет его значением null (поскольку ни один пользователь не является текущим зарегистрированным пользователем), и сохранение модели завершится неудачей.
Этот фрагмент иллюстрирует, как я решал эту проблему до сих пор:
$owner = $this->createUser(); // creates user with fake data
Yii::$app->user->setIdentity($owner);
$vehicle = $this->createVehicle(); // creates vehicle and relies that the $owner->UserID will be set when vehicle is being saved
Однако мне это не нравится, потому что не очевидно, почему идентификатор пользователя устанавливается заранее. Есть ли способ отключить Blameable
поведение при тестировании?
Ответ №1:
Просто отсоедините BlamableBehavior в вашем createVehicle()
методе следующим образом:
public function createVehile()
{
$vehicle = new Vehicle();
$vehicle->detachBehavior('blameable');
// ...
}
Комментарии:
1. В моем случае, используя то же
BlameableBehavior
, что и @ddinchev, мне нужно было отсоединить все usingdetachBehaviors();
для работы. возможно, имя «обвиняемый» работает не во всех случаях.
Ответ №2:
Отключение поведения не решит проблему для тех, кто использует 'value' => Yii::$app->user->identity->username
, поскольку вызов new Model все равно выдаст ошибку.
Вместо этого вы можете использовать метод _before для установки идентификатора для всех тестов.
модульный тест
use appmodelsUser; // your user class
class SupplierTest extends CodeceptionTestUnit
{
protected function _before()
{
// Required for model blameable behavior using Yii@.
$owner = new User();
$owner->username = 'tester';
$owner->auth_key = '123456';
$owner->password_hash = '123456';
$owner->email = 'something@some.com';
$owner->save();
Yii::$app->user->setIdentity($owner);
}
public function testCreateRecord() {
$rec = new Supplier();
$rec->supplier = "Supplier ABC";
$rec->smr_number = "123456";
$rec->validate();
Debug::debug($rec->getErrors());
$this->assertTrue($rec->save());
}
различные модели поведения
public function behaviors()
{
return [
[
'class' => yiibehaviorsBlameableBehavior::className(),
'value' => Yii::$app->user->identity->username,
],
[
'class' => yiibehaviorsTimestampBehavior::className(),
'value' => new yiidbExpression('NOW()'),
],
[
'class' => 'sammayeaudittrailLoggableBehavior',
'userAttribute' => 'updated_by', //blameable attribute of the current model.
'ignored' => ['updated_by', 'updated_at'], // This ignores fields from a selection of all fields, not needed with allowed
],
];
}