2011-10-03 80 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

Kudos!像魅力一样工作。非常感谢你! – Marcelo

0

我会假设在每次测试之前都会调用一个方法。你可以在那里设置cookie。在java中,你有注解@Before。

+0

在PHPUnit中,您创建了一个名为'setUp()'的方法 - 与JUnit中的非注释方式相同。 –

2

而不是使$ _SESSION成为您的单元测试的依赖项,您应该参数化每个函数所需的会话部分。然后您可以轻松地模拟单元测试中的参数。以目前的方式来做这件事太困难了,并且使得你的代码不易测试。这将需要更改当前的代码,但它会改进您的代码并使其更具可测试性。

+0

那么,这是我尝试单元测试的第一个项目。我不知道如何用模拟**对象替换$ _SESSION(一个数组)。我不能参考。你有没有实现这个目标的代码示例?非常感谢您的帮助。 – Marcelo