2010-07-13 3 views
1

자, 이제 제가 겪었던 문제가 있습니다. 일부 프로덕션 시스템에서는 gpc를 사용할 수있는 마술 따옴표가 있습니다. 그것에 대해 할 수있는 일은 없습니다. 그래서 나는 보상하기 위해 내 요청 데이터 나눠 수업을 구축했습니다 :다양한 시스템 ini 설정으로 테스트하십시오.

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 문서 검색을 시도했지만이 유형의 문제와 관련된 것을 찾을 수 없습니다. 내가 여기서 누락 된 것이 있습니까? 아니면 모든 가능한 코드 실행 경로를 테스트 할 수없는 상태로 살아야합니까?

감사

답변

1

, 나는 ... 해결 방법을 통해 생성자에서

와서 나는 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을 설정하는 public 메서드를 제공합니다. 그것은 정말로 깨끗하지는 않지만, 각각의 재귀에서 함수 호출의 오버 헤드를 절약 할 수 있기 때문에 좋습니다.

1

나는이 약 100 % 확실하지 않다,하지만 난 magic_quotes_gpc의 단지 모든 문자열이 addslashes() 그들에게 적용했다 것을 의미 생각합니다. 따라서 magic_quotes_gpc를 에뮬레이트하려면 $_GET, $_POST$_COOKIE 어레이에 addslashes를 재귀 적으로 적용 할 수 있습니다. 그것은 get_magic_quotes_gpc()이 false를 반환 할 것이라는 사실을 해결하지 못합니다. 적절한 단위 테스트를 수행 할 때 을 true으로 바꾸면됩니다.

편집 :

http://www.php.net/manual/en/function.addslashes.php에 명시된 바와 같이 'PHP 지시어 magic_quotes_gpc는 기본값으로 설정되어, 그것은 본질적으로 모든 GET, POST, 및 COOKIE 데이터에 addslashes()를 실행합니다.' 이 추한되고, 잘 ... 단점이있다 OFC

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

하지만 INI :

1

가능한 (그러나 완벽하지 않음) 용액과 같은 파라미터로 get_magic_quotes_gpc()의 값을 전달하는 것 설정 및 정의는 항상 테스트하기에 끔찍한데, 그 이유를 피하기 위해 노력해야합니다. 직접 사용하지 않도록하는 한 가지 방법은 다음과 같습니다 잘

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(); 
} 
+0

글쎄, 그게 올바른 길에 있습니다 ... 나는 다른 것을 구현했습니다 (제 대답을보십시오). 두 가지 예와 비슷하지만 (다른 경우) ... 다시 한 번 감사드립니다 ... – ircmaxell

관련 문제