1

该测试针对 POST api 端点,其中数据作为 JSON 包含在帖子正文中。在拨打电话之前,我将其设置Content-Type'application/json'. 但是,当我测试格式时isFormat('JSON'),响应为空。如果我转储,$request->contentType()这也会产生空值。

setHttpHeader('Content-Type','application/json')在功能测试期间为什么没有正确设置标题的任何原因?

4

2 回答 2

1

你的设置方法是正确的,但是在 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()正确地制作!

你可以在这里找到更新。

于 2012-10-29T16:30:13.003 回答
1

多亏了@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()->
于 2012-10-30T18:13:44.303 回答