Я тестирую модули с использованием тестов 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();
Технически вы еще не отправили запрос в свое приложение, поэтому на него нет удаленного адреса. На самом деле это то, о чем говорит ваша ошибка.
Чтобы обойти это:
переместите строку ниже:
// Won't work, see comment below $crawler = $client->request('POST', '/category/new');
Или вы можете составить IP-адрес и протестировать его. Поскольку вы используете только IP для сохранения модели, это будет работать так же хорошо.
Подобно @apokryfos, упомянутому в комментариях, считается ошибочной практикой доступ к суперглобалам в тестовых случаях. Поэтому вариант 2, вероятно, ваш лучший выбор здесь.