1

このテストは、データが投稿の本文に JSON として含まれる POST API エンドポイント用です。post 呼び出しを行う前に、 を に設定しContent-Typeました'application/json'。ただし、形式をテストするとisFormat('JSON')、応答は null です。これをダンプすると、$request->contentType()null も生成されます。

setHttpHeader('Content-Type','application/json')機能テスト中にヘッダーが正しく設定されない理由はありますか?

4

2 に答える 2

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

true を返します。

ヘッダーの設定をテストしたかったので、新しいテスター メソッドを 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 に答える
1

あなたの設定方法は正しいですが、sfBrowserBase 内にこのバグがあります:

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 に答える