2010-11-24 49 views
1

我看到這句話在備份的PHPUnit Documentation:「爲靜態類的備份和恢復操作屬性」,在PHP

實施和 還原類的靜態 屬性操作需要PHP 5.3 (或更高版本)。的 執行備份和恢復操作 全局變量和靜態屬性的類 使用序列化()和 反序列化()

這背後有什麼想法?我的意思是,我沒有爲此使用序列化和反序列化。這些所謂的「備份和恢復」操作究竟與靜態屬性有關?

+1

你能鏈接到手冊部分嗎? – 2010-11-24 08:11:32

回答

3

這個想法只是爲了恢復測試之間的初始已知狀態。靜態屬性與全局變量基本相同。考慮

class TestSubject 
{ 
    public static $i = 0; 
    public function __construct() { self::$i++; } 
} 

現在假設你在測試的設置方法創建的TestSubject新實例。因爲靜態屬性在類的所有實例之間共享,所以TestSubject::i將在每次創建新實例時增加。它不會被重置。它在全球範圍內維護其狀態。這對於單元測試是不希望的,因爲爲了編寫可靠的測試,您需要一個獨立的,可再現的和已知的狀態。因此,受保護的成員必須在測試用例之間重置,您可以在PHPUnit中使用@backupStaticAttributes註釋啓用它們。

例子:

/** 
* @backupStaticAttributes enabled 
*/ 
class Test extends PHPUnit_Framework_TestCase 
{ 
    public function testInitialValueOfStaticMemberIsZero() 
    { 
     $this->assertSame(0, TestSubject::$i); 
    } 
    /** 
    * @depends testInitialValueOfStaticMemberIsZero 
    */ 
    public function testCreatingInstancesIncreasesStaticMember() 
    { 
     new TestSubject(); 
     new TestSubject(); 
     new TestSubject(); 
     $this->assertSame(3, TestSubject::$i); 
    } 
    /** 
    * @depends testCreatingInstancesIncreasesStaticMember 
    */ 
    public function testStaticMembersAreResetBetweenTests() 
    { 
     $this->assertSame(0, TestSubject::$i); 
    } 
} 

如果刪除註釋,第三次測試將失敗。

+0

有道理。你有什麼想法在PHP 5.3中改變了行爲?我沒有看到關於`serialize()`的文檔中有關正在被序列化的靜態屬性的任何內容 – 2010-11-24 08:28:01