2017-01-11 92 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'或其他超全局獲取IP地址。爲他們創建容器,然後在測試時嘲笑它們。 – apokryfos

回答

1

從技術上講,您還沒有向您的應用程序發送請求,因此沒有遠程地址可供引用。這實際上就是你的錯誤告訴我們的。

要解決此問題:

  1. 招行以低於:

    // Won't work, see comment below  
    $crawler = $client->request('POST', '/category/new'); 
    
  2. 或者你可以讓一個IP地址,並測試這一點。由於您只使用IP來保存模型,所以這同樣適用。

像@apokryfos在評論中提到的那樣,在測試用例中訪問超級全局變量被認爲是不好的做法。所以選項2可能是你最好的選擇。

+1

即使在將行移動到下方的行$'crawler = $ client-> request('POST','/ category/new');'之後,您也不能使用'REMOTE_ADDR'。 –

+0

真的嗎?無論如何,那麼你應該真的使用選項2,無論如何,這是更好的選擇。 – Loek

+0

是的,我同意@Loek –

1

在測試用例中創建返回ip地址並模擬服務的服務。

在這裏,創建控制器和服務爲UserIpAddressget()將返回用戶的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 

現在,使用$UserIpAddress->get();