1

如何在PHPUnit中使用Symfony3填充/模仿服务器变量?如何在PHPUnit中使用Symfony3填充/模仿服务器变量?

我尝试为我的symfony3应用程序创建功能测试。我使用LiipFunctionalTestBundle

我有一个特殊的$_SERVER变量,其中包含访问者的国家。行为的行为强烈依赖于它。

我尝试在我的测试用例中填充它。

这里是一个基于Setting PHP INI settings, Constants and Global Variables in PHPUnit

<?xml version="1.0" encoding="UTF-8"?> 

<!-- https://phpunit.de/manual/current/en/appendixes.configuration.html --> 
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd" 
     backupGlobals="false" 
     colors="true" 
     bootstrap="app/autoload.php" 
> 
    <php> 
     <ini name="error_reporting" value="-1" /> 
     <server name="KERNEL_DIR" value="app/" /> 
     <server name="COUNTRY_CODE" value="AT" /> 
     <server name="HTTP_COUNTRY_CODE" value="AT" /> 
    </php> 

    <testsuites> 
     <testsuite name="Project Test Suite"> 
      <directory>tests</directory> 
     </testsuite> 
    </testsuites> 

    <filter> 
     <whitelist> 
      <directory>src</directory> 
      <exclude> 
       <directory>src/*Bundle/Resources</directory> 
       <directory>src/*/*Bundle/Resources</directory> 
       <directory>src/*/Bundle/*Bundle/Resources</directory> 
      </exclude> 
     </whitelist> 
    </filter> 
</phpunit> 


$client = static::createClient(array(), array(
    'PHP_AUTH_USER' => "test_login", 
    'PHP_AUTH_PW' => "test_password", 
    'HTTP_HOST'  => "phpunit.symfony.dev", 
    'REQUEST_URI' => "/app/setting", 
    'DOCUMENT_ROOT' => "/path/to/docroot/app/web" 
)); 

$this->client->request(
    'GET', 
    '/app/profile', 
    array(), 
    array(), 
    array(
     'COUNTRY_CODE'  => "AT", 
     'HTTP_COUNTRY_CODE' => "AT", 
     'SCRIPT_NAME'  => "thing/thong", 
     'HTTP_REFERER'  => '/foo/bar' 
    ) 
); 

当我通过dump($this->client->getRequest());的单元测试的要求,然后我看到我的变量的phpunit.xml.dist文件的内容:

Symfony\Component\HttpFoundation\Request {#1009 
    +attributes: Symfony\Component\HttpFoundation\ParameterBag {#1008 
    #parameters: [] 
    } 
    +request: Symfony\Component\HttpFoundation\ParameterBag {#1093 
    #parameters: [] 
    } 
    +query: Symfony\Component\HttpFoundation\ParameterBag {#1092 
    #parameters: [] 
    } 
    +server: Symfony\Component\HttpFoundation\ServerBag {#993 
    #parameters: array:22 [ 
     "PHP_AUTH_USER"  => "test_login" 
     "PHP_AUTH_PW"  => "test_password" 
     "SERVER_NAME"  => "phpunit.symfony.dev" 
     "HTTP_HOST"   => "phpunit.symfony.dev" 
     "REQUEST_URI"  => "/app/setting" 
     "DOCUMENT_ROOT"  => "/path/to/docroot/app/web" 
     "COUNTRY_CODE"  => "AT" 
     "HTTP_COUNTRY_CODE" => "AT" 
     "SCRIPT_NAME"  => "thing/thong" 
     "HTTP_REFERER"  => "/foo/bar" 

     "SERVER_PORT" => 80 
     "HTTP_USER_AGENT" => "Symfony BrowserKit" 
     "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" 
     "HTTP_ACCEPT_LANGUAGE" => "en-us,en;q=0.5" 
     "HTTP_ACCEPT_CHARSET" => "ISO-8859-1,utf-8;q=0.7,*;q=0.7" 
     "REMOTE_ADDR" => "127.0.0.1" 
     "SCRIPT_FILENAME" => "" 
     "SERVER_PROTOCOL" => "HTTP/1.1" 
     "REQUEST_TIME" => 1485369277 
     "PATH_INFO" => "" 
     "REQUEST_METHOD" => "GET" 
     "QUERY_STRING" => "" 
    ] 
    } 

但由于某种原因,我n个动作

public function indexAction(Request $request) 
{ 
    dump($_SERVER); 
} 

$_SERVER变量包含壳牌和环境变量来代替:

"LESSOPEN"    => "| /usr/bin/lesspipe %s" 
"PROFILEHOME"   => "" 
"GNOME_KEYRING_PID" => "" 
"USER"     => "developer" 
"LANGUAGE"    => "en_US" 
"UPSTART_INSTANCE"  => "" 
"XDG_SEAT"    => "seat0" 
"SESSION"    => "sess$58479" 
"XDG_SESSION_TYPE"  => "x11" 
"SHLVL"    => "2" 
"HOME"     => "/home/developer" 
"DESKTOP_SESSION"  => "sess$58479" 
"QT_LINUX_ACCESSIBILITY_ALWAYS_ON" => "1" 
"SHELL_SESSION_ID"  => "78c26972fe6040009409a2bd8748034d" 
"GTK_MODULES"   => "gail:atk-bridge:unity-gtk-module" 
"XDG_SEAT_PATH"  => "/org/freedesktop/DisplayManager/Seat0" 
"KONSOLE_DBUS_SESSION" => "/Sessions/1" 

我该怎么办错了吗? 有没有什么办法模仿命令行中的服务器变量,使用Symfony3和phpunit?

回答

1

我走错了路。我可以通过$request对象访问服务器变量:

public function indexAction(Request $request) 
{ 
    dump($request->server->get('HTTP_HOST')); 
    dump($request->server->get('COUNTRY_CODE')); 
} 
+0

嗨,如果这个答案已经解决你的问题,请考虑[接受它(http://meta.stackexchange.com/a/5235/237701)由点击复选标记。这向更广泛的社区表明您已找到解决方案。没有义务这样做。 –

+1

感谢您的提醒。我想删除这个问题,但系统提醒我这不是一个好的行为。 我也无法接受它在前两天的答案,然后我忘了它。 –

相关问题