Как использовать серверные переменные в тестах PHPUnit Test?

Я тестирую модули с использованием тестов PHPUnit Test. Все работает нормально, но когда я использую $_SERVER['REMOTE_ADDR'] он дает фатальную ошибку и прекращает выполнение.

CategoryControllerTest.php

 <?php namespace ProductBundle\Controller\Tests\Controller; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class CategoryControllerTest extends WebTestCase { protected function setUp() { static::$kernel = static::createKernel(); static::$kernel->boot(); $this->container = static::$kernel->getContainer(); $this->em = static::$kernel->getContainer()->get('doctrine')->getManager(); } public function testCategory() { $ip_address = $_SERVER['REMOTE_ADDR']; $client = static::createClient( array(), array('HTTP_HOST' => static::$kernel->getContainer()->getParameter('test_http_host') )); $crawler = $client->request('POST', '/category/new'); $client->enableProfiler(); $this->assertEquals('ProductBundle\Controller\CategoryController::addAction', $client->getRequest()->attributes->get('_controller')); $form = $crawler->selectButton('new_category')->form(); $form['category[name]'] = "Electronics"; $form['category[id]'] = "For US"; $form['category[ip]'] = $ip_address; $client->submit($form); $this->assertTrue($client->getResponse()->isRedirect('/category/new')); // check if redirecting properly $client->followRedirect(); $this->assertEquals(1, $crawler->filter('html:contains("Category Created Successfully.")')->count()); } } 

ошибка

Была 1 ошибка:

1) ProductBundle \ Tests \ Controller \ CategoryControllerTest :: testCategory Неопределенный индекс: REMOTE_ADDR

Я попытался добавить его в setUp() но он не работает.

Создайте службу, которая возвращает ip-адрес и издевается над сервисом в тестовом примере.

Здесь создайте контроллер и службу как UserIpAddress . get() вернет ip-адрес пользователя.

service.yml

 UserIpAddress: class: AppBundle\Controller\UserIpAddressController arguments: container: "@service_container" 

UserIpAddressController.php

 class UserIpAddressController { public function get() { return $_SERVER['REMOTE_ADDR']; } } 

Создайте макет службы «UserIpAddress». Он переопределит существующий сервис. Используйте сервис UserIpAddress для получения IP-адреса в вашем проекте.

CategoryControllerTest.php

 $UserIpAddress = $this->getMockBuilder('UserIpAddress') ->disableOriginalConstructor() ->getMock(); $UserIpAddress->expects($this->once()) ->method('get') ->willReturn('192.161.1.1'); // Set ip address whatever you want to use 

Теперь получите ip-адрес, используя $UserIpAddress->get();

Технически вы еще не отправили запрос в свое приложение, поэтому на него нет удаленного адреса. На самом деле это то, о чем говорит ваша ошибка.

Чтобы обойти это:

  1. переместите строку ниже:

     // Won't work, see comment below $crawler = $client->request('POST', '/category/new'); 
  2. Или вы можете составить IP-адрес и протестировать его. Поскольку вы используете только IP для сохранения модели, это будет работать так же хорошо.

Подобно @apokryfos, упомянутому в комментариях, считается ошибочной практикой доступ к суперглобалам в тестовых случаях. Поэтому вариант 2, вероятно, ваш лучший выбор здесь.