2011-10-03 4 views
3

코드를 단위 테스트 할 수 없습니다.

$ _SESSION은 다음 테스트가 실행될 때마다 지워집니다. testStartProductSession()을 실행하면 객체가 $ _SESSION 변수에 일부 데이터를 추가합니다. 하지만 다음 테스트 메소드 (testSessionIdIsKept())를 실행하면 $ _SESSION이 다시 비어 있습니다.

단위 테스트시 $ _SESSION이 로컬 변수가됩니다.

나는 무엇을 해야할지 잘 모릅니다. 다음 출력을 확인하십시오 :

// session_start() on bootrap.php; 

class MC_Session_ProductTest extends PHPUnit_Framework_TestCase 
{ 

    /** 
    * @return MC_Session_Product 
    */ 
    public function getObject() 
    { 
     // make getInstance() return new instance instead of singleton instance 
     MC_Session_Product::$isUnityTest = true; 
     $object = MC_Session_Product::getInstance(); 
     $object->getWsClient()->setServerListUrl(SERVER_LIST_URL); 
     return $object; 
    } 

    /** 
    * All tests pass 
    * @depends testSetParam 
    */ 
    public function testStartProductSession() 
    { 
     $developerId = PARAM_DEVELOPER_ID; 
     $productCode = PARAM_PRODUCT_CODE; 
     $productVersion = PARAM_PRODUCT_VERSION; 
     $platform = PARAM_PLATAFORM; 
     $deviceType = PARAM_DEVICE_TYPE; 
     $locale = PARAM_LOCALE; 

     try { 
      $object = $this->getObject(); 
      $object->startSession($developerId, $productCode, $productVersion, 
            $platform, $deviceType, $locale); 
      $this->assertTrue($object->sessionStarted()); 
     } catch (Exception $e) { 
      $this->fail('Fail to start session: ' . $object->getLastUrl()); 
     } 

     echo "\$_SESSION in testStartProductSession(): ", print_r($_SESSION, 1); 
     return $object; 
    } 

    /** 
    * Test fails because $_SESSION is empty again 
    * @depends testStartProductSession 
    */ 
    public function testSessionIdIsKept(MC_Session_Product $lastObject) 
    { 
     echo "\$_SESSION in testSessionIdIsKept(): ", print_r($_SESSION, 1); 
     $object = $this->getObject(); 
     // fails 
     $this->assertTrue($lastObject->sessionStarted()); 
     $this->assertTrue($object->sessionStarted()); 
     $this->assertEquals($lastObject->getSessionId(), $object->getSessionId()); 
     return $object; 
    } 
} 

/* ###### Output 


$_SESSION in testStartProductSession(): 
Array 
(
    [__MC] => Array 
     (
      [MC_Session_Product] => Array 
       (
        [keyOne] => 'valueOne' 
        [sessionId] => 'someId' 
       ) 

     ) 

) 
$_SESSION in testSessionIdIsKept(): 
Array 
(
) 

*/ 

답변

0

PHPUnit은 각 테스트 메소드 이전에 모든 글로벌 변수 ($_SESSION 포함)를 시작 값으로 재설정합니다. $backupGlobals 인스턴스 속성을 false으로 다시 정의하여 테스트 사례에 대해이 기능을 비활성화 할 수 있습니다. 이 방법은 setUp()에서 작동하지 않습니다.

class MyTest extends PHPUnit_Framework_TestCase 
{ 
    protected $backupGlobals = FALSE; 

    // ... 
} 

자세한 내용은 Global Variables and PHPUnit을 참조하십시오.

+0

명성! 매력처럼 일했습니다. 고마워요! – Marcelo

0

모든 테스트 전에 호출되는 방법이 있다고 가정합니다. 쿠키를 설정할 수 있습니다. 자바에서는 @Before라는 어노테이션이있다.

+0

PHPUnit에서 JUnit의 비 주석 방식과 동일한 'setUp()'메소드를 생성합니다. –

2

$ _SESSION을 단위 테스트에 종속시키는 대신 각 함수가 필요로하는 세션 부분을 매개 변수화해야합니다. 그런 다음 단위 테스트에서 매개 변수를 쉽게 조롱 할 수 있습니다. 이렇게하면 현재 시도하고있는 방식이 너무 어렵고 코드를 테스트하기가 쉽지 않습니다. 이렇게하려면 현재 코드를 변경해야하지만 코드가 개선되어 테스트가 더욱 쉬워집니다.

+0

음, 이것은 단위 테스트를 시도한 첫 번째 프로젝트입니다. mock ** 객체 **로 $ _SESSION (배열)을 어떻게 대체 할 수 있는지에 대한 가장 희한한 생각이 없습니다. 나는 그것을 언급 할 수 없다. 목표를 달성 할 수있는 코드 샘플이 있습니까? 당신의 도움을 주셔서 대단히 감사합니다. – Marcelo

관련 문제