目前,我正在为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);
}
答案 0 :(得分:3)
您的解决方案正在运行,但更好的方法可能如下:
有关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');
您还可以调用请求的方法:getScheme和isSecure以获取此信息(例如,检查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());
}
}
我也试过了。
但是正确的解决方案可供讨论。