Symfony2验收测试不起作用

时间:2016-09-06 14:18:50

标签: php unit-testing symfony phpunit symfony-routing

目前,我正在为Symfony2应用程序编写验收测试用例。我正在做以下。

namespace my\Bundle\ProjectBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class DefaultControllerTest extends WebTestCase
{
    public function testIndex()
    {
        $client = static::createClient();

        $client->request('GET', '/');

        $this->assertEquals(200, $client->getResponse()->getStatusCode());
    }
}

但是它在查看以下日志文​​件时失败了。

app/logs/test.log

似乎

[2016-09-06 12:56:58] request.CRITICAL: Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: SERVER_PROTOCOL" at /var/www/src/my/Bundle/projectBundle/Helper/DataHelper.php line 139 {"exception":"[object] (PHPUnit_Framework_Error_Notice(code: 8): Undefined index: SERVER_PROTOCOL at /var/www/src/my/Bundle/projectBundle/Helper/DataHelper.php:139)"} []

$_SERVER变量似乎缺少某些值。任何线索或有更好的方法来编写测试用例。

DataHelper.php

public function getCanonicalUrl()
    {
        $router = $this->container->get('router');
        $req = $this->container->get('request');
        $route = $req->get('_route');
        if (!$route) {
            return 'n/a';
        }
        $url = $router->generate($route, $req->get('_route_params'));
        $protocol = stripos($_SERVER['SERVER_PROTOCOL'], 'https') === true ? 'https://' : 'http://';
        return $protocol . ($this->getHostname() . $url);
    }

2 个答案:

答案 0 :(得分:3)

您的解决方案正在运行,但更好的方法可能如下:

阅读doc about symfony2 testing

有关request()方法的更多信息:

  

request()方法的完整签名是:

request(
    $method,
    $uri,
    array $parameters = array(),
    array $files = array(),
    array $server = array(),
    $content = null,
    $changeHistory = true
)
     

服务器阵列是您通常希望找到的原始值   在PHP $_SERVER超全局中。

因此可能采用更清洁的方法:

$client->request(
    'GET',
    '/',
    array(),
    array(),
    array(
        'SERVER_PROTOCOL'          => 'http://',
    )
);

一个问题可能是您在SERVER_PROTOCOL变量中设置的值。关于to the doc

  

'SERVER_PROTOCOL'信息协议的名称和修订版   请求页面;即'HTTP / 1.0';

似乎真实值为'HTTP/1.0'(而不是http://)。因此请仔细检查生成错误的类DataHelper.php

编辑:

您可以访问symfony2请求中的HTTP_SERVER变量(这在doc中)

// retrieve $_SERVER variables
$request->server->get('HTTP_SERVER');

您还可以调用请求的方法:getSchemeisSecure以获取此信息(例如,检查Request类的源代码)。在您的情况下,getScheme方法可能就是您所需要的。例如:

$protocol = $req->getScheme();

希望这个帮助

答案 1 :(得分:0)

无论如何,到目前为止我找到了或多或少的解决方法。如下所示,无论如何它是一个测试用例。

namespace Chip\Bundle\PraxistippsBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class DefaultControllerTest extends WebTestCase
{
    public function testIndex()
    {
        $_SERVER['SERVER_PROTOCOL'] = 'http://';

        $client = static::createClient();

        $client->request('GET', '/');

        $this->assertEquals(200, $client->getResponse()->getStatusCode());
    }
}

我也试过了。

Stackoverflow One more Answer

但是正确的解决方案可供讨论。