Marcuzy
@Marcuzy
php разработчик

Как инициализировать Yii::$app для теста?

Создал приложение на основе https://github.com/trntv/yii2-starter-kit
Пытаюсь освоить TDD, есть модель с такими правилами валидации

public function rules()
	{
		return [
			[['brand_name', 'article_name', 'amount', 'price'], 'required'],
			
			[['price'], 'number'],
			[['amount'], 'number'],

			[['brand_name'], 'string', 'max'=>Part::BRAND_NAME_MAX_LENGTH, 'min'=>Part::BRAND_NAME_MIN_LENGTH],
			[['article_name'], 'string', 'max'=>Part::ARTICLE_NAME_MAX_LENGTH, 'min'=>Part::ARTICLE_NAME_MIN_LENGTH],
		];
	}


Тест создает экземпляр модели, заполняет данными, а при вызове метода validate() тест валится с ошибкой

1) tests\codeception\backend\unit\PriceRowTest::testValidateForColumnsOrder1
yii\base\ErrorException: Trying to get property of non-object

[yii\base\ErrorException] Trying to get property of non-object

#1  D:\OpenServer_\OpenServer\domains\abparts.local\vendor\yiisoft\yii2\validators\StringValidator.php:85
#2  D:\OpenServer_\OpenServer\domains\abparts.local\vendor\yiisoft\yii2\base\Object.php:107
#3  yii\base\Object->__construct
#4  D:\OpenServer_\OpenServer\domains\abparts.local\vendor\yiisoft\yii2\di\Container.php:372
#5  D:\OpenServer_\OpenServer\domains\abparts.local\vendor\yiisoft\yii2\di\Container.php:151
#6  D:\OpenServer_\OpenServer\domains\abparts.local\vendor\yiisoft\yii2\BaseYii.php:344
#7  D:\OpenServer_\OpenServer\domains\abparts.local\vendor\yiisoft\yii2\validators\Validator.php:206
#8  D:\OpenServer_\OpenServer\domains\abparts.local\vendor\yiisoft\yii2\base\Model.php:441
#9  D:\OpenServer_\OpenServer\domains\abparts.local\vendor\yiisoft\yii2\base\Model.php:405
#10 D:\OpenServer_\OpenServer\domains\abparts.local\vendor\yiisoft\yii2\base\Model.php:185


Пройдясь по стеку, обнаружил, что в StringValidator Yii::$app не является объектом, т.е. приложение не инициализировано для теста. Как правильно инициализировать его, я так понял это нужно сделать где-нибудь в bootstrap.php, и почему в шаблоне по-умолчанию оно не инициализировано?

UPD:
Добавил следующие строчки в метод setUp теста

$config = require(__DIR__ . '/../../config/backend/unit.php');
(new \yii\console\Application($config));


и всё заработало, однако, почему нельзя этого сделать в файле _bootstrap.php (пробовал, но эффекта никакого).

UPD2:
Решение:
class FooTest extends TestCase
{
	protected function setUp()
    {
        parent::setUp(); //важно вызвать родительский метод
    }

    //....
}

В parent::setUp(); происходит вызов mockApplication().

А правильнее вместо setUp/tearDown использовать _before/_after, если используется codeception, тогда никаких доп. заморочек не появляется.
  • Вопрос задан
  • 456 просмотров
Решения вопроса 1
miraage
@miraage
Старый прогер
https://github.com/yiisoft/yii2/blob/master/tests/...

protected function setUp()
{
    parent::setUp();
    $this->mockApplication();
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы