Тестирование Yii2 при использовании обвиняемого поведения

#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, мне нужно было отсоединить все using detachBehaviors(); для работы. возможно, имя «обвиняемый» работает не во всех случаях.

Ответ №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
            ],
        ];
    }