2017-01-11 8 views
3

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

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 Undefined index: REMOTE_ADDR

Я пытался добавить его в setUp() функции, но она не работает, а также ,

+0

Вы не должны непосредственно получить доступ к '$ _SERVER' или другим суперглобальным, если вы хотите, чтобы сделать ваше приложение более проверяемым. Создавайте контейнеры для них, а затем издевайтесь над ними при тестировании. – apokryfos

ответ

1

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

Чтобы обойти эту проблему:

  1. ход линия должна быть ниже:

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

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

+1

Вы не можете использовать 'REMOTE_ADDR' даже после перемещения строки до строки' $ crawler = $ client-> request ('POST', '/ category/new'); '. –

+0

Действительно? Во всяком случае, тогда вы действительно должны использовать вариант 2, который является лучшим выбором независимо от того, что. – Loek

+0

да я согласен с @Loek –

1

Создайте услугу, которая возвращает 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']; 
    } 
} 

Create mock of "UserIpAddress" service. It will override existing service. Use 'UserIpAddress' service to get ip address in your project.

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();

 Смежные вопросы

  • Нет связанных вопросов^_^