Тестирование с различными настройками ini системы - PullRequest
1 голос
/ 13 июля 2010

Хорошо, вот проблема, с которой я столкнулся.В некоторых наших производственных системах мы включили магические кавычки 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, но я не могу найти ничего, связанного с этим типом проблемы.Есть ли что-то, что я здесь скучаю?Или мне придется смириться с невозможностью протестировать все возможные пути выполнения кода?

Спасибо

Ответы [ 3 ]

1 голос
/ 13 июля 2010

Возможное (но не идеальное) решение состоит в том, чтобы передать значение 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 всегда ужасны, поэтому вам следует избегать их.Один из способов избежать их непосредственного использования:

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();
}
1 голос
/ 13 июля 2010

Ну, я наткнулся на обходной путь ...

В конструкторе я вызываю get_magic_quotes_gpc():

protected $magicQuotes = null;

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

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

Затем, для тестирования, я просто подкласс это,и затем предоставьте публичный метод для ручной установки $this->magicQuotes.Это не совсем чисто, но приятно, так как экономит накладные расходы при вызове функции при каждой рекурсии ...

1 голос
/ 13 июля 2010

Я не уверен на 100% в этом, но я думаю, что magic_quotes_gpc просто означает, что ко всем строкам было применено addslashes(). Таким образом, чтобы эмулировать magic_quotes_gpc, вы можете рекурсивно применять аддлэш к массивам $_GET, $_POST и $_COOKIE. Это не решает тот факт, что get_magic_quotes_gpc() будет возвращать false - вам просто придется заменить get_magic_quotes_gpc() на true при выполнении соответствующего модульного теста, я думаю.

Редактировать: как указано в http://www.php.net/manual/en/function.addslashes.php

'PHP-директива magic_quotes_gpc включена по умолчанию и, по сути, запускает addlashes () для всех данных GET, POST и COOKIE.'

...