Andreas Löer

Softwareentwicklung, Softwaretests

Yii: automatische Tests

without comments

Für die automatischen Tests bei Yii sind zwei Verzeichnisse vorgesehen, deren Tests getrennt gestartet werden können. Einmal das Verzeichnis unit für die Unittests und das Verzeichnis functional für die funktinonalen Tests, die hier auf Selenium basieren.
Read the rest of this entry »

Written by Andreas

Juni 4th, 2012 at 9:17 am

Posted in Yii

Tagged with

Yii: Kein index.php im Link

without comments

Mit dem Yii-Framework lässt sich eine Basisanwendung generieren. Diese bietet z.B. schon einen Login und ein Kontaktformular.
Auch innerhalb der Konfigurationsdatei sind schon einige Voreinstellungen vorhanden, die bei Bedarf eingesetzt werden können. Leider fehlen hier einige Möglichkeiten, die den Einstieg noch mehr erleichtern könnten. In meinem Fall habe ich die .htaccess so eingestellt das nicht vorhandene Dateien oder Verzeichnisse auf die index.php umgelenkt werden.
Die Methode createUrl lieferte mir allerdings stets ein index.php im Link mit. Nach einiger Suche war die Lösung aber relatviv einfach:
In der Konfiguration für den urlManager in der Datei protected/config/main.php muss der Parameter showScriptName auf false gesetzt werden:

		'urlManager'=>array(
			'urlFormat'=>'path',
			'showScriptName' => false,
			'rules'=>array(
                            'web/<action:\w+>' => 'web',
                            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
			),
		),

Written by Andreas

Juni 1st, 2012 at 11:37 am

Posted in Yii

Yii: Benutzung des Models in der Konsole

without comments

Im Yii-Framework lassen sich einfach Konsolenkommandos anlegen, allerdings haben diese eine eigene Konfigurationsdatei. Daher funktioniert nicht alles auf Anhieb genauso wie in der Web-Applikation. Auch bei einer generierten Applikation sind daher Anpassungen nötig.
Read the rest of this entry »

Written by Andreas

Mai 31st, 2012 at 9:28 am

Posted in Yii

Yii: Konsolenkommando erstellen

without comments

Das leichtgewichtige PHP-Framework Yii bietet die Möglichkeit einfach ein Kommando für die Konsole hinzuzufügen. Leider ist hier die Dokumentation etwas ungenau was die Formalitäten betrifft.
Um ein Kommando Import zu erstellen wird eine Klasse ImportCommand als Ableitung von CConsoleCommand erstellt. Diese Klasse wird unter dem Verzeichnis protected/commands erstellt und muss in der Datei ImportCommand.php enthalten sein.

class ImportCommand extends CConsoleCommand
{
    public function actionIndex() {  }
}

Jetzt kann das Kommando aufgerufen werden:

yii import index

Written by Andreas

Mai 31st, 2012 at 9:03 am

Posted in Yii

PHPunit: Testen von privaten Methoden

without comments

Mit Hilfe der Reflectionklassen in PHP lassen sich auch Methoden in einem Objekt testen, die private oder protected sind. So lässt sich die Methode testMethod in dem folgenden Beispiel nicht testen, da PHP mit einem Fehler abbricht.

class TestClass {
  private function testMethod ( $value ) {
    return $value;
  }
}

Innerhalb des Tests wird ein Objekt vom Type ReflectionMethod erzeugt, das die Methode indirekt über die Methode invoke ausführbar macht.

public function testTestMethod() {
  $to = new TestClass();

  $method = new ReflectionMethod($to,'testMethod');
  $method->setAccessible(true);

  $this->assertEquals(123,$method->invoke($to,'123'));
  $this->assertEquals(124,$method->invoke($to,'456'));
}

Die Reflection-API wurde laut Handbuch mit der PHP-Version 5 eingeführt. Dieser Code wurde mit der Version 5.3 getestet.

Written by Andreas

Mai 24th, 2012 at 11:27 am

Posted in phpunit

Win7: VHost-Konfiguration für Zend

without comments

Für die Konfiguration einer Zend-Umgebung unter Apache und Windows  sind einige Schritte notwendig.

Als erstes muss der Schutz der Hosts-Datei abgeschaltet werden. Dies wird im installierten Virenschutz durchgeführt, in meinem Fall ist der Virenschutz von Avira.

Read the rest of this entry »

Written by Andreas

Mai 21st, 2012 at 9:08 am

Posted in Zend-Framework

Tagged with ,

Zend: Erweitertes Testen des Restcontrollers

without comments

Für effektiveres Testen der JSON-Antwort eines Controllers entwickle ich eine Ableitung der Klasse Zend_Test_PHPUnit_ControllerTestCase. In dieser Klasse sollen die Funktionalitäten zum Zugriff auf in die JSON-Daten, ähnlich der DomQuery-Assertmethoden.
In einem ersten Schritt existiert eine Methode die prüft, ob die Daten auch im JSON-Format vorliegen. Wenn der Controller noch Fehlermeldungen an die Daten anhängt, wird durch die Dekodierung eine Exception geworfen. Diese wird hier in eine PHPUnit_Framework_ExpectationFailedException umgewandelt.

class PMLib_Test_PHPUnit_ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{

    public function assertResponseIsJson ( $message = '' ) {
        $this->_incrementAssertionCount();
        $bodyData = $this->getResponse()->getBody();
        try {
            $decode = Zend_Json::decode($bodyData);
        }
        catch (Zend_Json_Exception $exception ) {
            $message .= "\nFailed asserting JSON format";
            throw new PHPUnit_Framework_ExpectationFailedException( $message );
        }
    }
}

Written by Andreas

Mai 15th, 2012 at 3:58 pm

Posted in Zend-Framework

Tagged with ,

Zend: Testen des Restcontrollers

without comments

Das automatische Testen des Restcontrollers funktioniert im Prizip genauso wie das Testen der anderen Controller. Allerdings sind hier einige Details zu beachten:

  • Der angegebene Controller muss darf nicht den Namen des Controllers enthalten (der ist normalerweise großgeschrieben), sondern muss genauso wie der Controlleranteil des Links geschrieben werden.
  • Der ID-Parameter muss an die URL angehängt werden, da der Link sonst nicht genauso aussieht wie einer, der von einem Restclient geliefert wird.
  • Die Methode muss explizit gesetzt werden.

 

Beispiel für den Action delete Link /rest/1

    public function testDeleteAction()
    {
        $params = array('action' => 'index', 'controller' => 'rest', 'module' => 'default');
        $urlParams = $this->urlizeOptions($params);
        $url = $this->url($urlParams);
        $url .= '/1';
        $this->getRequest()
                ->setMethod('delete')
                ->setHeader('X_REQUESTED_WITH','XMLHttpRequest');

        $this->dispatch($url);

        // assertions
        $this->assertModule($urlParams['module']);
        $this->assertController($urlParams['controller']);
        $this->assertAction('delete');

        $this->assertResponseCode('204');
        $this->assertContentType('application/json');
    }

 

 

Written by Andreas

Mai 10th, 2012 at 2:35 pm

Posted in Zend-Framework

Tagged with , ,

Zend: ControllerTestCase – Liste mit Assert-Funktionen

without comments

Hier ist eine Liste mit den Assert-Funktionen, die im Controllertest des Zend-Frameworks (Zend_Test_PHPUnit_ControllerTestCase) implementiert sind. Diese Klasse ist eine Ableitung vom bekannten PHPUnit_Framework_TestCase.

Read the rest of this entry »

Written by Andreas

Mai 9th, 2012 at 8:43 am

Posted in Zend-Framework

Tagged with ,

Extjs – Form sendet keinen X_REQUESTED_WITH

without comments

Wird in Extjs eine Form verwendet, so wird beim Speichern kein X_REQUESTED_WITH-Header gesendet. Grund ist laut der Dokumentation in den Quellen eine generierte versteckte Form, die per Submit die Daten absendet. Diese Form wird nach dem Empfang der Antwort wieder entfernt.

Zu beachten ist ausserdem , das wenn eine JSON-Antwort gesendet wird muss der Content-Type der Antwort „text/html“ sein. Diese Anwort wird vom Browser in das Document eingetragen und erst dann vom Extjs in ein XMLHttpRequest-Objekt kopiert.

Written by Andreas

Mai 8th, 2012 at 12:34 pm

Posted in Extjs