Создал приложение на основе
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, тогда никаких доп. заморочек не появляется.