cannot redeclare ... das re-deklarieren erzwingen?

NetBull

Erfahrenes Mitglied
Hi,

ich arbeite mit phpUnit und habe eine Klasse die mir eine abstrakte Klasse wegmocken soll. Beide heissen gleich sind nur in anderen Strukturen.

Konzept:
../MockedUnits/BaseObject/BaseObject.php
../PhpUnits/BaseObject/BaseObject.php

Nun kommt es beim Testen einzelner Klassen zu keinem Problem. Da ich im Kopf jeder Test-Klasse so was habe:
Code:
$mPathToMockedClasses = getenv("PathToMockedUnits");
	$PathToRealUnits = getenv("PathToRealUnits");	
	
	if( empty( $mPathToMockedClasses ) ){
		
		$mFile = __FILE__;
		$mFile = str_replace("\\", "/", $mFile);
		$mPos = strpos($mFile, "/PhpUnits/");
		$mFile = substr($mFile, 0, $mPos);
		
		$mPathToMockedClasses = $mFile . "/MockedUnits";
		$PathToRealUnits = $mFile . "/PhpUnits";
	}
	
	include_once ($mPathToMockedClasses . "/BaseObject/BaseObject.php");	
	include_once ($mPathToMockedClasses . "/Page/Page.php");
	include_once ($mPathToMockedClasses . "/DocType/DocType.php");
	include_once ($mPathToMockedClasses . "/PageHeader/PageHeader.php");
	include_once ($mPathToMockedClasses . "/PageBody/PageBody.php");
	include_once ("WebDocument.php");

 	class WebDocumentTest extends PHPUnit_Framework_TestCase{
 		
 		public function setUp(){}
 		
 		public function testConstruction(){
 			$o=new WebDocument();
 			$this->assertTrue($o->isMocked());
 			$this->assertSame(4, $o->getCounter());
 		}.....


Effekt:
Nun kann ich je nach Bedarf entweder mit den echten Klassen testen (integration tests) oder mit den gemockten Klassen (unit test).

Problem:
Nur das ich an und wann ein cannot redeclare bekomme..

Frage:
Kann ich mit irgendeinem Befehl alle bekannten Klassen löschen? Oder ein redeclare erzwingen?

cu deAndro....
 
Relativ sicher nein.

Ansonsten kann ich deiner Beschreibung leider nicht so recht folgen.

@mermshaus: Na ich hab eine abstrakte Klasse welche eine Menge Eigenschaften und Methoden für ein kleines Framework zur Verfügung stellt, da quasi alle Klassen von Ihr Erben. Nun möchte ich im UnitTest nicht jedesmal gegen die BasisKlasse testen (das wäre ja ein Integrations-Test) sondern gegen eine gemockte Klasse. Die gemockte Klasse enthält die gleichen öffentlichen und geschützten Methoden, nur das die eben ein testbares - statisches- liefern. Denn im UnitTest will ich zwar jede Klasse testen, aber nicht deren Parent-Klassen
 
Welche PHP-Version kommt zum Einsatz? Wenn es PHP 5.3 oder neuer ist, lege ich dir das Thema Namensräume ans Herz.

5.3 irgendwas. Namespaces kenne ich noch von c#. Aber irgendwie habe ich nicht ganz begriffen wie das unter php funktioniert und welchen Sinn das macht.

Zu meiner konkreten Situation, wird mir der Namespace nicht weiter helfen, denn eine vererbte Klasse erbt im gleichen Name-Space, ... oder?
 
Vielleicht ist es eine Option, --process-isolation zu setzen (beziehungsweise – oder wohl besser – die Menge der Tests in zwei Gruppen zu unterteilen, die du unabhängig voneinander aufrufst).

- http://phpunit.de/manual/current/en/phpunit-book.html#textui.clioptions

Ansonsten vielleicht dieser Suchstring: „phpunit mocking parent class“

Das liefert unter anderem:

You dont mock or stub methods in the Subject-under-Test (SUT). If you feel you have the need to mock or stub a method in the parent of the SUT, it likely means you shouldnt have used inheritance, but aggregation.

You mock dependencies of the Subject-under-Test. That means any other objects the SUT requires to do work.

- http://stackoverflow.com/a/6711948/90237

Fachlich seriös kann ich dazu aber leider spontan nichts sagen. (Das Thema – Vererbung vs. Aggregation – ist aber auch außerhalb des Test-Kontexts schon undankbar genug, glaube ich.) Da müsste ich auch erst mal eine Menge recherchieren.
 
Zuletzt bearbeitet:
5.3 irgendwas. Namespaces kenne ich noch von c#. Aber irgendwie habe ich nicht ganz begriffen wie das unter php funktioniert und welchen Sinn das macht.

Zu meiner konkreten Situation, wird mir der Namespace nicht weiter helfen, denn eine vererbte Klasse erbt im gleichen Name-Space, ... oder?

Es funktioniert bei PHP wie in anderen Sprachen auch. Eine Klasse liegt in einem bestimmten Namensraum. Wenn man keinen Namensraum angibt, liegt die Klasse im Standard-Namensraum "".

Du könntest für deine Mocking-Klasse einen Namensraum "Test" etablieren und dann über extends die Klasse aus dem Standard-Namensraum erben lassen:

PHP:
/** File: Base/Default.php **/
class Base_Default {
  // fields and methods...
}

/** File: Test/Base/Default.php **/
namespace Test;
class Base_Default extends \Base_Default {
  // fields and methods...
}

- Ja, da kann man einen Autoloader hin drauf implementieren, der dass unterscheiden kann. :)
- Ja, das sollte dein Problem lösen ;-)

Zum einfachen Ausprobieren habe ich mal ein Beispiel-Projekt angehängt.
 

Anhänge

  • namespace.7z
    947 Bytes · Aufrufe: 18
Zuletzt bearbeitet:
Moin,...

und hmmm... (*AmNichtvorhandenenBartKraulend)...
Beides einleuchtend...

Allerdings scheint mir "in der Tat"das mein Weg der Falsche ist. Vielleicht will ich gar nicht die Parent-Klasse mocken, ... Ich glaube ich gehe lieber den anderen Weg wo das Parent nicht gemockt wird...
 

Neue Beiträge

Zurück