2010-11-24 4 views
1

ich diesen Satz in der„Sicherungs- und Wiederherstellungsvorgänge für statische Klassenattribute“ in PHP

Die Umsetzung der Sicherung PHPUnit Documentation: sah und Operationen für statische Attribute von Klassen wiederherzustellen erfordert PHP 5.3 (oder höher). Die Implementierung von die Sicherung und dahinter von Klassen verwendet serialize() und unserialize()

Was ist die Idee Operationen für globale Variablen und statische Attribute wiederherstellen? Ich meine, ich habe für diesen Zweck keine Serialisierung und Deserialisierung verwendet. Wie genau beziehen sich diese sogenannten "Backup- und Restore" -Operationen auf statische Attribute?

+1

Können Sie mit dem manuellen Abschnitt verlinken? –

Antwort

3

Die Idee ist einfach, den ursprünglichen bekannten Zustand zwischen den Tests wiederherzustellen. Statische Eigenschaften sind im Wesentlichen die gleichen wie globale Variablen. Betrachten

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

nun annehmen, dass Sie neue Instanzen von TestSubject in Ihrem Test des Setup-Methode erstellen. Da die statischen Eigenschaften von allen Instanzen einer Klasse gemeinsam genutzt werden, wird TestSubject::i jedes Mal größer, wenn Sie eine neue Instanz erstellen. Es wird nicht zurückgesetzt. Es behält seinen Zustand global bei. Dies ist bei Unit-Tests unerwünscht, denn um zuverlässige Tests schreiben zu können, benötigen Sie einen isolierten, reproduzierbaren und bekannten Zustand. Daher müssen geschützte Member zwischen Testfällen zurückgesetzt werden, die Sie in PHPUnit mit der @backupStaticAttributes Annotation aktivieren können.

Beispiel:

/** 
* @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); 
    } 
} 

Wenn Sie die Anmerkung entfernen, wird der dritte Test nicht bestehen.

+0

Sinn macht. Hast du eine Idee, was sich in PHP 5.3 geändert hat, um das Verhalten zu ändern? Ich sehe nichts in den Docs auf 'serialize()' über statische Eigenschaften, die jetzt serialisiert werden –

+0

@Pekka nein Entschuldigung. Keine Ahnung. – Gordon

+0

Vielleicht wegen ['__callStatic'] (http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods). –

Verwandte Themen