Поддельный IP на функциональных тестах Codeception

Я использую Yii2 и Codeception для запуска тестов.

Когда я запускаю функциональный тест, $SERVER['REMOTE_ADDR'] не определено. Как я могу макет IP для использования в этих тестах.

я пытался $SERVER['REMOTE_ADDR'] = '127.0.0.1', Но это не работает.

4 ответа

Вчера я столкнулся с такой проблемой и нашел решение! Итак, мое решение связано с фреймворком Yii2, но я думаю, что вы сможете изменить его для своей среды.

  1. Расширьте свой модуль кодирования (для меня Yii2):
      <?php

namespace codeception;

use Codeception\Module\Yii2;

class CustomModule extends Yii2
{
    protected function recreateClient()
    {
        parent::recreateClient();

        if ($ip = ($this->config['ip'] ?? null)) {
            $this->client->setServerParameter('REMOTE_ADDR', $ip);
        }
    }
}

  1. Перейдите в конфигурацию codeception.yaml и установите свой ip:
      actor: MyTester
modules:
    enabled:
        - \Helper\E2eCommon
        - Asserts
        - Mockery
        # here
        - \codeception\CustomModule:
            configFile: 'codeception/_config/config.php'
        - REST:
            # here
            depends: \codeception\CustomModule
            part: Json
    config:
        # and here!
        \codeception\CustomModule:
            ip: 192.168.1.1 # ip mock here!

extensions:
    enabled:
        - \ResetYiiContainerExtension

это все! наслаждаться :)

  1. Найдите 2 файла (если проект построен на основе шаблона yii2-app-basic - удалите из каталога пути common/):
    • common/config/codeception-local.php
    • environments/dev/common/config/codeception-local.php
  2. Добавьте внутрь массива:
      [
    ...
    'on beforeAction' => static function () {
        $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
    },
    ...
]

Создайте свой функциональный класс Helper в tests/_support (если он не существует):

class FunctionalHelper extends \Codeception\Module {
    public function _before(\Codeception\TestInterface $test)
    {
        $this->getModule('Yii2')->client->defaultServerVars = array_merge(
            $this->getModule('Yii2')->client->defaultServerVars,
            ['REMOTE_ADDR' => '127.0.0.1']
        );            
    }
}

Для версий codecept >=2.4 и <4.0 попробуйте использовать что-то похожее на:

class Helper extends \Codeception\Module
{
    /**
     * {@inheritdoc}
     */
    public function _before(\Codeception\TestInterface $test)
    {
        $this->getModule('Yii2')->client->setServerParameter('REMOTE_ADDR', '127.0.0.1');
    }
}

и не забудьте включить его в *.suite.yml файл:

modules:
    enabled:
        - \tests\Helper\Helper

Другие вопросы по тегам