• Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

[PHPUnit] Probleme mit getMockForAbstractClass()

Ben

New member
Hi,
ich würde gerne eine abstrakte Klasse testen.

PHPUnit bietet da mit getMockForAbstractClass($classname) ja eine entsprechende Methode an (siehe Doku). Scheint ja auch bei jedem gut zu funktionieren ... ich finde nämlich im Netz nichts, was meinem Problem entspricht.
Mein Code ist überschaubar.

PHP:
abstract class Hallo {
	
	public abstract function zonk();
	
	public function pasta() {
		return true;
	}
}
Ich will jetzt die Methode "pasta" testen.

Ich dachte mir also, dass ich folgendes mache:
PHP:
include_once 'Hallo.php';

class HalloTest extends \PHPUnit_Framework_TestCase {
	
	
	public function testPasta() {
		
		$stub = $this->getMockForAbstractClass('Hallo');
		$this->assertTrue($stub->pasta());
	}
}
Aber das funktioniert nicht.
Ich erhalte diese Fehlermeldung:
Code:
PHPUnit_Framework_Exception: Class "Hallo" does not exist.
Okay. Ich hab mir mal die Signatur bzw. die Methode getMockForAbstractClass() selbst angeschaut. Ich habe da mal den "autoload"-Parameter auf false gestellt, keine Änderung.
Die Methode sieht ja folgendermaßen aus.
PHP:
    protected function getMockForAbstractClass($originalClassName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE)
    {
        if (!is_string($originalClassName)) {
            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
        }

        if (!is_string($mockClassName)) {
            throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'string');
        }

        if (class_exists($originalClassName, $callAutoload)) {
            $methods   = array();
            $reflector = new ReflectionClass($originalClassName);

            foreach ($reflector->getMethods() as $method) {
                if ($method->isAbstract()) {
                    $methods[] = $method->getName();
                }
            }

            if (empty($methods)) {
                $methods = NULL;
            }

            return $this->getMock(
              $originalClassName,
              $methods,
              $arguments,
              $mockClassName,
              $callOriginalConstructor,
              $callOriginalClone,
              $callAutoload
            );
        } else {
            throw new PHPUnit_Framework_Exception(
              sprintf(
                'Class "%s" does not exist.',
                $originalClassName
              )
            );
        }
    }
Es wird also immer der else-Zweig getroffen. Ich habe aktuell leider nicht die Möglichkeit da rumzudebuggen und hoffe, dass mir jemand von meinem Denkfehler befreien kann. Ich bin eigentlich der Überzeugung, dass es was total simples sein muss, was ich falsch mache .. aber ich finde es einfach nicht heraus. :confused:

Ich habe aktuell leider nur PHPUnit 3.6.12 zur Verfügung.
Wenn mir jemand helfen kann .. sage ich schon jetzt brav DANKE. :)
 

crash

New member
Du hast keinen Autoloader der die Klasse lädt bzw. kein require_once. Darum ist die Klasse nicht bekannt.

Ich empfehle dir Composer zu benutzen und dann den von ihn erzeugten Autoloader zu benutzen.

Edit:
Jetzt sehe ich, da ist ein include_once, dann stimmt wohl der Pfad nicht und durch dein zu geringes Error-Level sieht du die Warnungen nicht.

Beim entwickeln immer error_reporting(-1) bzw. <ini name="error_reporting" value="-1"/> in der phpunit.xml. Außerdem immer möglichst require_once benutzen.
 
Zuletzt bearbeitet:
Oben