该测试针对 POST api 端点,其中数据作为 JSON 包含在帖子正文中。在拨打电话之前,我将其设置Content-Type
为'application/json'
. 但是,当我测试格式时isFormat('JSON')
,响应为空。如果我转储,$request->contentType()
这也会产生空值。
setHttpHeader('Content-Type','application/json')
在功能测试期间为什么没有正确设置标题的任何原因?
该测试针对 POST api 端点,其中数据作为 JSON 包含在帖子正文中。在拨打电话之前,我将其设置Content-Type
为'application/json'
. 但是,当我测试格式时isFormat('JSON')
,响应为空。如果我转储,$request->contentType()
这也会产生空值。
setHttpHeader('Content-Type','application/json')
在功能测试期间为什么没有正确设置标题的任何原因?
你的设置方法是正确的,但是在 sfBrowserBase 里面有这个bug:
foreach ($this->headers as $header => $value)
{
$_SERVER['HTTP_'.strtoupper(str_replace('-', '_', $header))] = $value;
}
以 HTTP 为前缀设置 content_type。但是在您的操作 $request->getContentType() 方法中假设您没有前缀。
所以如果你改变这个:
foreach ($this->headers as $header => $value)
{
$_SERVER[strtoupper(str_replace('-', '_', $header))] = $value;
}
你可以$request->getContentType()
正确地制作!
你可以在这里找到更新。
多亏了@nicolx,我可以解释更多关于正在发生的事情并提供一些进一步的指导。
正如@nicolx 所指出的,$request->getContentType()
正在寻找不带前缀 HTTP_ 的 HTTP 标头(请参阅第 163 至 173 行sfWebRequest
)。但是,sfBrowserBase 总是将 HTTP_ 前缀添加到所有标头。所以添加这个mod:
foreach($this->headers as $header => $value)
{
if(strotolower($header) == 'content-type' || strtolower($header) == 'content_type')
{
$_SERVER[strtoupper(str_replace('-','_',$header))] = $value;
} else {
$_SERVER['HTTP_'.strtoupper(str_replace('-','_',$header))] = $value;
}
}
这将处理ContentType
在您的操作中设置和检测到的标头。如果您不包含HTTP_
前缀,则其他标头将不起作用(例如$request->isXmlHtttpHeader()
,即使您在测试文件中设置它也会失败)。
测试方法isFormat()
不是测试 ContentType 标头,而是测试 Symfony 路由设置sf_format。如果我将路线设置为特别有sf_format: json
例如
some_route:
url: /something/to/do
param: {module: top, action: index, sf_format: json}
然后测试
with('request')->begin()->
isFormat('json')->
end()->
返回真。
由于我想测试标头设置,我向 sfTesterRequest 添加了一个新的测试器方法,名为isContentType()
. 这个方法的代码是:
public function isContentType($type)
{
$this->tester->is($this->request->getContentType(),$type, sprintf('request method is "%s"',strtoupper($type)));
return $this->getObjectToReturn();
}
调用这个测试就变成了:
with('request')->begin()->
isContentType('Application/Json')->
end()->