2

目前,我正在为 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变量中缺少一些值。任何线索或是否有更好的方法来编写测试用例。

数据助手.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);
    }
4

2 回答 2

3

您的解决方案有效,但更好的方法可能如下:

阅读有关 symfony2 测试的文档:

更多关于 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变量中设置的值有关。关于文档

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

希望这有帮助

于 2016-09-06T22:44:19.957 回答
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 另一个答案

但是一个正确的解决方案是有待讨论的。

于 2016-09-06T14:48:40.497 回答