1

さて、これが私が遭遇した問題です。一部の本番システムでは、マジッククォートgpcが有効になっています。それについて私にできることは何もありません。そこで、以下を補うためにリクエストデータ処理クラスを作成しました。

protected static function clean($var)
{
     if (get_magic_quotes_gpc()) {
        if (is_array($var)) {
            foreach ($var as $k => $v) {
                $var[$k] = self::clean($v);
            }
        } else {
            $var = stripslashes($var);
        }
    }
    return $var;
}

私はその方法で他のことをしますが、それは問題ではありません。

そのため、私は現在、そのメソッドの単体テストのセットを作成しようとしていますが、ロードボックに遭遇しました。結果に関して両方の実行パスをテストするにはどうすればよいget_magic_quotes_gpc()ですか?実行時にini設定を変更できません(すでにロードされているため)... PHPUnitのドキュメントを検索しようとしましたが、このタイプの問題に関連するものが見つかりません。ここで欠けているものはありますか?または、考えられるすべてのコード実行パスをテストできない状態で生活する必要がありますか?

ありがとう

4

3 に答える 3

1

これについて 100% 確信があるわけではありませんが、magic_quotes_gpc はすべての文字列がaddslashes()それらに適用されたことを意味していると思います。したがって、magic_quotes_gpc を持つことをエミュレートするには、addslashes を$_GET$_POSTおよび$_COOKIE配列に再帰的に適用できます。それはfalseを返すという事実を解決しません-適切な単体テストを行うときにに置き換えるだけでよいと思いますget_magic_quotes_gpc()get_magic_quotes_gpc()true

編集: http://www.php.net/manual/en/function.addslashes.phpに記載されているとおり

「PHP ディレクティブの magic_quotes_gpc はデフォルトでオンになっており、基本的にすべての GET、POST、および COOKIE データに対して addslashes() を実行します。」

于 2010-07-13T14:57:39.120 に答える
1

可能な (完全ではない) 解決策は、次のように get_magic_quotes_gpc() の値をパラメーターとして渡すことです。

protected static function clean($var, $magic_quotes = null)
{
  if ($magic_quotes === null) $magic_quotes = get_magic_quotes_gpc();
  do_stuff();
}

これには欠点があります...まあ、醜いですが、ini設定と定義は常にテストするのが恐ろしいので、それらを避けるようにしてください。それらを直接使用しないようにする1つの方法は次のとおりです。

class Config
{
  private static $magic_quotes = null;

  public static GetMagicQuotes()
  {
    if (Config::$magic_quotes === null)
    {
      Config::$magic_quotes = get_magic_quotes_gpc();
    }
    return Config::$magic_quotes;
  }

  public static SetMagicQuotes($new_value)
  {
    Config::$magic_quotes = $new_value;
  }
}

[...somewhere else...]

protected static function clean($var)
{
  if (Config::GetMagicQuotes())
  {
    do_stuff();
  }
}

[... in your tests...]


public test_clean_with_quotes()
{
  Config::SetMagicQuotes(true);
  doTests();
}

public test_clean_without_quotes()
{
  Config::SetMagicQuotes(false);
  doTests();
}
于 2010-07-13T14:59:18.197 に答える
1

さて、私は回避策に出くわしました...

コンストラクターでは、次を呼び出しますget_magic_quotes_gpc()

protected $magicQuotes = null;

public function __construct() {
    $this->magicQuotes = get_magic_quotes_gpc();
}

protected function clean($var) {
    if ($this->magicQuotes) {
        //...
    }
}

次に、テストのために、それをサブクラス化し、手動で設定するための public メソッドを提供します$this->magicQuotes。あまりきれいではありませんが、再帰ごとに関数呼び出しのオーバーヘッドを節約できるので便利です...

于 2010-07-13T16:19:49.770 に答える