2

How can I populate/imitate server variables in PHPUnit Test cases using Symfony3?

I try to create functional tests for my symfony3 application.

I use LiipFunctionalTestBundle.

I have a special $_SERVER variable which contains the country of the visitor. The behavior of the action strongly depends on it.

I try to populate it in my test case.

Here is the content of the phpunit.xml.dist file which is based on 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"
));

and

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

when I get the request in the unittest by dump($this->client->getRequest()); then I see my variables:

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" => ""
    ]
  }

but for some reason, in the action

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

the $_SERVER variable contains the Shell and Environmental Variables instead:

"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"

What do I do wrong? Is there any way to imitate the server variables in command line, using Symfony3 and phpunit?

1 Answer 1

3

I was on a wrong way. I can access the server variables through the $request object:

public function indexAction(Request $request)
{
    dump($request->server->get('HTTP_HOST'));
    dump($request->server->get('COUNTRY_CODE'));
}
Sign up to request clarification or add additional context in comments.

3 Comments

Hi, if this answer has solved your question please consider accepting it by clicking the check-mark. This indicates to the wider community that you've found a solution. There is no obligation to do this.
thanks for the reminder. I wanted to delete this question, but the system reminded me this isn't a good behavior. I also couldn't accept it as an answer in the first two days, then I forgot about it.
In some areas like in the test environment you may need to use Symfony\Component\HttpFoundation\RequestStack instead of Request. It's because when testing with the Client object, the $_SERVER and Request are not available in some parts. More info here.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.