Как эффективно управлять конфигурациями при проведении юнит-тестов?

У меня возникла ошибка при запуске теста, и я не могу понять, как ее исправить. Ошибка выглядит следующим образом: <br/> <blockquote>[PHPUnit\Framework\Error\Warning] Попытка чтения свойства "centrifugo" у null  <br/>
<br/>
#1  /var/www/project/frontend/config/main.php:169<br/>
#2  /var/www/project/frontend/config/codeception-local.php:5<br/>
#3  /var/www/project/vendor/symfony/event-dispatcher/EventDispatcher.php:264<br/>
#4  /var/www/project/vendor/symfony/event-dispatcher/EventDispatcher.php:239<br/>
#5  /var/www/project/vendor/symfony/event-dispatcher/EventDispatcher.php:73<br/>
#6  /var/www/project/vendor/bin/codecept:119</blockquote> <br/> <br/> В файле frontend/config/main.php у меня указано: <br/> <br/> <pre><code class="php">...
'components' =&gt; [
  ...
  'headers' =&gt; [
            'class' =&gt; '\hyperia\security\Headers',
            'upgradeInsecureRequests' =&gt; true,
            'blockAllMixedContent' =&gt; true,
            'requireSriForScript' =&gt; false,
            'requireSriForStyle' =&gt; false,
            'xssProtection' =&gt; true,
            'xFrameOptions' =&gt; 'DENY',
            'xPoweredBy' =&gt; 'Hyperia',
            'cspDirectives' =&gt; [
                'connect-src' =&gt; "'self' " . Yii::$app-&gt;centrifugo-&gt;ws . " https://www.google-analytics.com https://kinescope.io",
                ....
            ],
        ]
],</code></pre> <br/> Как мне переопределить конфигурации в Codeception, чтобы избежать ошибки, связанной с Yii::$app->centrifugo?
  • 16 февраля 2025 г. 18:14
Ответы на вопрос 1
Для того чтобы эффективно управлять конфигурациями при проведении юнит-тестов с использованием Codeception и Yii, важно создать изолированную среду для тестов. Ошибка, которую вы получаете, указывает на то, что свойство `centrifugo` у `Yii::$app` не инициализировано, что приводит к попытке доступа к свойству у `null`. 

### Шаги для решения вашей проблемы:

1. **Настройка окружения для тестирования**:
   Вам нужно создать специальную конфигурацию для тестового окружения, которая будет отличаться от вашей основной конфигурации. Обычно это файл `codeception-local.php`, но вы также можете создать еще один файл конфигурации, который будет содержать настройки для тестов.

2. **Создание mock-объекта**:
   Если вам не нужно реальное подключение к `centrifugo` в методах тестирования, вы можете создать mock-объект для `centrifugo`. Например:

   ```php
   use yii\base\ErrorException;

   // В вашем файле тестов
   public function _before()
   {
       Yii::$app->set('centrifugo', new \yii\base\Component([
           'ws' => 'ws://example.com', // Укажите значение, которое вам необходимо
       ]));
   }
   ```
   Это гарантирует, что `Yii::$app->centrifugo` будет инициализирован перед выполнением тестов.

3. **Обработка конфигураций в Codeception**:
   В файле `codeception-local.php` (`frontend/config/codeception-local.php`), вы можете переопределить нужные компоненты:

   ```php
   return [
       'components' => [
           'centrifugo' => [
               'class' => 'yii\base\Component',
               'ws' => 'ws://example.com' // Подставьте нужные значения
           ],
           // Другие компоненты, которые вам нужны для тестов
       ],
   ];
   ```

4. **Проверка инициализации**:
   Добавьте проверку на наличие нужного компонента в `frontend/config/main.php`:

   ```php
   'components' => [
       // другие компоненты
       'centrifugo' => Yii::$app->has('centrifugo') ? Yii::$app->centrifugo : null,
   ],
   ```

5. **Отладка тестов**:
   После реализации вышеуказанных шагов попробуйте перезапустить тесты. Если ошибка продолжает возникать, проверьте, правильно ли загружаются ваши конфигурационные файлы. Так же убедитесь, что ваши тесты не зависят от конкретных внешних систем или состояния, которое может быть не доступно в тестовой среде.

### Заключение
Эти шаги помогают избежать обращения к `null` при использовании компонентов, которые могут быть недоступны во время выполнения юнит-тестов. Важно всегда заботиться об изоляции тестов от внешних зависимостей и окружения.
Похожие вопросы