php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.01.2012, 16:04  
Geist der Zeit
Gast
 
Beiträge: n/a
Standard [Erledigt] PHPUnit - Test einer Methode

Hallo PHPler,

wir beschäftigen uns in einer Vorlesung mit Reverse-Engineering. Uns liegt eine in PHP geschriebene Community vor, für die wir einige PHPUnit-Tests schreiben sollen. Leider ist dies auch mein erster Kontakt mit PHP - deswegen habe ich sehr geringe PHP-Kenntnisse.

Mein konkretes Problem ist das Erstellen von Tests für die Methoden:

Ich habe mir nun eine Methode ausgesucht, die einen vorhandenen Planungsabschnitt editiert.

PHP-Code:
    public static function editPlanningSection(PlanningSection $section) {
        
$translate getTranslate("planner");
        if(!
$section->validate()) {
            
self::editPlanningSectionDialog($section);
        } else {
            if (
EstudyDB::addEditPlanningSection($section)) {
                echo 
Functions::generateMessage(
                    
$translate->_("Planungsabschnitt erfolgreich editiert."),
                    
"note"
                
);
            } else {
                echo 
Functions::generateMessage(
                    
$translate->_("Es ist ein unerwarteter Fehler aufgetreten. Planungsabschnitt wurde nicht editiert."),
                    
"warning"
                
);
            }
            
// Show Section list
            
$planner = new PlannerMashup($_SESSION['course']);
            
$planner->start();
        }
    } 
Jetzt habe ich versucht, einen Test zu schreiben. Dieser soll einen Planungsabschnitt erzeugen und ihn der obigen Methode übergeben. Der Test soll erfolgreich sein, wenn addEditPlanningSection($section) aufgerufen wird.

PHP-Code:
class PlanningSectionManagerTest extends PHPUnit_Framework_TestCase {

    protected 
$object;

    protected function 
setUp() {
        
$_SESSION['course'] = 42// Konstruktor erwartet eine sessionID
        
$arr = array('planID' => 1000'author' => 'testAuthor''title' => 'testTitle''content' => 'testContent''starttime' => '0001-01-01 01:01:01''endtime' => '0001-01-02 02:02:02''eventstart' => '0001-01-01 01:01:01''eventend' => '0001-01-02 02:02:02'); // Die anderen Werte, die der Konstruktor erwartet.
        
$object = new planningSection($arr);
    }

    protected function 
tearDown() {

    }

    public function 
testShouldEditPlanningSection() {
        
$this->assertTrue(editPlanningSection($object));
    }


Leider steige ich garnicht dahinter, wie ich bei so einem PHPUnit Test vorgehen soll. Das fängt schon mit dem Object an (ich weiß nicht, ob ich einfach so eines erstellen kann - er hat z.B. mit dem Datum Probleme) und hört mit der Logik - wie ich einen Test strukturiere - auf.

Hilfreich wäre für mich, wenn mir jemand erklären könnte, wie ich bei solch einem Test vorgehe und wie ich z.B. ein passendes Objekt erstelle oder wir der Test prüfen kann, ob der Planunsabschnitt editierbar ist.

Ich hoffe, ich habe mich noch verständlich genug ausgedrückt.

Vielen Dank schonmal für Eure Mühe,

Geist der Zeit
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 07.01.2012, 18:03  
Geist der Zeit
Gast
 
Beiträge: n/a
Standard

Hallo zusammen,

ich hatte etwas Zeit mich mehr mit PHPUnit auseinanderzusetzen. Der Unit-Test sieht jetzt wie folgt aus:

PHP-Code:
if (! defined("PATH_TO_ROOT")) define("PATH_TO_ROOT""../../../");

require_once 
PATH_TO_ROOT 'planner/classes/model/class.planningsection.inc.php';
require_once 
PATH_TO_ROOT 'planner/classes/controller/class.planningsectionmanager.inc.php';

global 
$_SESSION;

class 
PlanningSectionManagerTest extends PHPUnit_Framework_TestCase {

    protected 
$object;
    
    protected function 
setUp() {
        
parent::setUp();
        
$this->object = new PlanningSectionManager;
    }
    
    protected function 
tearDown() {
        
parent::tearDown();
        
$this->object null;
    }

    public function 
testEditPlanningSection() {
        
        
$_SESSION['course'] = '42';
        
$assertion '<div class="note">Planungsabschnitt wurde erfolgreich editiert.<br /></div>';
        
$item = array(
            
'planID' => '1',
            
'courseID' => $_SESSION['course'],
            
'author' => 'testAuthor',
            
'title' => 'testTitle',
            
'content' => 'testContent',
            
'visibleType' => 'true',
            
'starttime' => '2012-01-01 01:01:01',
            
'endtime' => '2012-02-02 02:02:02',
            
'eventstart' => '2012-01-01 01:01:01',
            
'eventend' => '2012-02-02 02:02:02'
        
);
        
        
$ps = new PlanningSection($item);
        
        
// buffer output to compare
        
ob_start();
        
$this->object->editPlanningSection($ps);
        
$out ob_get_contents();
        
ob_end_clean();
        
        
//compare output with expected value
        
assertEquals($assertion$out);
    }

Leider läuft der Test nicht fehlerfrei. Ich bekomme folgende Ausgabe:

Code:
PHPUnit 3.6.4 by Sebastian Bergmann.

E<div class="important">Bitte f&uuml;llen Sie die "&Uuml;berschrift" aus!<br /></div>


Time: 0 seconds, Memory: 31.25Mb

There was 1 error:

1) PlanningSectionManagerTest::testEditPlanningSection
Trying to get property of non-object

/home/shsr46/git/swt-ueb-3-planer/web/common/classes/class.data.inc.php:277
/home/shsr46/git/swt-ueb-3-planer/web/planner/classes/class.estudydb.inc.php:312
/home/shsr46/git/swt-ueb-3-planer/web/planner/classes/view/class.planningsectioneditorview.inc.php:95
/home/shsr46/git/swt-ueb-3-planer/web/planner/classes/controller/class.planningsectionmanager.inc.php:43
/home/shsr46/git/swt-ueb-3-planer/web/planner/classes/controller/class.planningsectionmanager.inc.php:53
/home/shsr46/git/swt-ueb-3-planer/web/planner/tests/controller/class.planningsectionmanagertest.inc.php:74
/usr/bin/phpunit:44

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.
Zeile 74 im class.planningsectionmanagertest.inc.php ist: $this->object->editPlanningSection($ps);

Der Codeabschnitt in class.planningsectionmanager.inc.php sieht so aus:

PHP-Code:
/**
     * Shows edit form for planning section.
     * @param PlanningSection $section Section to edit.
     */
    
public static function editPlanningSectionDialog(PlanningSection $section) {
         
$planningSectionEditorView = new PlanningSectionEditorView(false$section);
/*Zeile 43*/ $planningSectionEditorView->show();
    }
    
    
/**
     * Updates the data of a planning section.
     * @param PlanningSection $section Section with new data.
     */
    
public static function editPlanningSection(PlanningSection $section) {
        
$translate getTranslate("planner");
        if(!
$section->validate()) {
/*Zeile 53*/    self::editPlanningSectionDialog($section);
        } else {
            if (
EstudyDB::addEditPlanningSection($section)) {
                echo 
Functions::generateMessage(
                    
$translate->_("Planungsabschnitt erfolgreich editiert."),
                    
"note"
                
);
            } else {
                echo 
Functions::generateMessage(
                    
$translate->_("Es ist ein unerwarteter Fehler aufgetreten. Planungsabschnitt wurde nicht editiert."),
                    
"warning"
                
);
            }
            
// Show Section list
            
$planner = new PlannerMashup($_SESSION['course']);
            
$planner->start();
        }
    } 
Kann mir jemand auf die Sprünge helfen, und mir erklären, was ich falsch mache?

Vielen Dank,

Geist der Zeit
  Mit Zitat antworten
Alt 07.01.2012, 19:36  
Erfahrener Benutzer
 
Registriert seit: 26.12.2010
Beiträge: 175
PHP-Kenntnisse:
Anfänger
elise befindet sich auf einem aufstrebenden Ast
Standard

editPlanningSection ist statisch.
Teste sie über Bereichszugriff:

PHP-Code:
$ps = new PlanningSection($item);
PlanningSectionManager::editPlanningSection($ps); 
__________________
OSL♥
elise ist offline   Mit Zitat antworten
Alt 07.01.2012, 20:08  
Geist der Zeit
Gast
 
Beiträge: n/a
Standard

Danke elise,

aber der Fehler "Trying to get property of non-object" bleibt leider erhalten.

Soweit ich mich schlau machen konnte, sagt die Meldung aus, dass ich auf Eigenschaften eines "Nicht-Objektes" zuzugreifen versuche.
Bezieht sich denn die Meldung auf $this->object oder etwas anderes?
  Mit Zitat antworten
Alt 09.01.2012, 15:13  
Geist der Zeit
Gast
 
Beiträge: n/a
Standard

Hallo zusammen,

ich habe nun einen finalen Test, der auch OK liefert. Da ich neu in PHP und PHPUnit bin, bin ich mir sicher, dass dieser nicht ganz "sauber" ist, aber er testet

PHP-Code:
if (! defined("PATH_TO_ROOT")) define("PATH_TO_ROOT""../../../");

require_once 
PATH_TO_ROOT "../unit-tests/database/AbstractEStudyDatabaseTest.php";
require_once 
PATH_TO_ROOT 'planner/classes/controller/class.planningsectionmanager.inc.php';


class 
PlanningSectionManagerTest extends AbstractEStudyDatabaseTest {
    
/**
     * @var    Functions
     */
    
protected $object;
    
    
/**
     * 
     * Function creates some planningsections
     */
    
protected function getDataSet() {
        return 
$this->createXMLDataSet(PATH_TO_ROOT "planner/tests/datasets/automation-planningsections.xml");
    }
    
    protected function 
setUp() {
        
parent::setUp();
        
$_SESSION['portal_type']='learning';
        
$_SESSION['portal_language']='de_DE';
        
$_SESSION['usergroup'] = '3';
        
$_SESSION['userid'] = 1;
        
$this->getDataSet();
        
$this->object = new PlanningSectionManager;
    }
    
    protected function 
tearDown() {
        
parent::tearDown();
        unset(
$_SESSION['portal_type']);
        unset(
$_SESSION['portal_language']);
        unset(
$_SESSION['usergroup']);
        unset(
$_SESSION['userid']);
        
$this->object null;
    }
    
    
/**
     *
     * Function tests if EditPlanningSection was not successful.
     * PlanningSectionManager::editPlanningSection(PlanningSection $section)
     */
    
public function testEditPlanningSectionShouldBeSuccessful() {
        
// setUp
        
$sectionID '1003';
        
$_SESSION['course']    = $sectionID;
        
        
$expected '<form action="plannereditor.php?cmd=editSection';
        
$planningsection EstudyDB::getPlanningSectionByID($sectionID);

        
// buffer output
        
ob_start();
        
$this->object->editPlanningSection($planningsection);
        
$actual ob_get_contents();
        
ob_end_clean();
        
        
//compare output with expected value
        
$this->assertContains($expected$actual);
        
        
// tearDown
        
unset($_SESSION['course']);
        
$planningsection null;
    }

        
// weitere Tests 
Der Fehler mit Trying to get property of non-object lag wahrscheinlich daran, dass $item ein Array und kein Objekt war. Mit $ps = new PlanningSection((object) $item); hat's funktioniert. Aber das habe ich eh verworfen und mir ein paar Einträge in die DB geschrieben, sodass ich darauf zugreifen kann.

Geist der Zeit
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
in einer Statichen Methode eine NICHT statiche Methode aufrufen ? 7Style PHP Einsteiger 16 26.07.2011 04:06
Inhalt / Ergebnis einer Methode in einer anderen Methode verwenden / ausführen litterauspirna PHP Tipps 2010 10 09.04.2010 14:58
Statische Methode bei Vererbter Klasse Puccini PHP-Fortgeschrittene 7 14.03.2010 20:39
Elemente zu Array hinzufügen freggeln PHP Tipps 2009 4 31.12.2009 01:44
Methode gibt keinen return netdirk PHP Tipps 2009 9 30.12.2009 17:01
PHPUnit - Metriken grunz PHP-Fortgeschrittene 1 07.11.2009 21:08
preg_replace prüft nur einmal / nicht verschachtelt hazer PHP Tipps 2009 10 04.02.2009 22:54
CSS - Bild im div container überlappt andere container Buschdieb HTML, Usability und Barrierefreiheit 13 19.07.2007 23:17
Verständnisprobleme bei Utf8 > Character Set > Collate erna Datenbanken 4 20.03.2007 14:08
div-Aufteilung, die ich einfach nicht hinkriege Faebe HTML, Usability und Barrierefreiheit 3 28.12.2006 15:15
Bekomme eine bestimmte Sortierung nicht hin!!! Picard Datenbanken 3 29.06.2006 08:10
hover im IE ,suckerfish modifizieren? HTML, Usability und Barrierefreiheit 3 06.02.2006 16:52
PHP5: Klassenattribut für statische Methode, mit Vererbung PHP-Fortgeschrittene 9 24.05.2005 09:35
zeilenumbrücke in der DB in einer zeile stehen lassen kain PHP Tipps 2004-2 7 23.11.2004 19:38

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
require_once path_to_root . \'common/classes/class.output.inc.php\';, php unit test method, phpunit zugriff auf protected, phpunit test object is null, phpunit vererbung?, phpunit trying to get property of non-object, erledigt phpunit geist der zeit, cmd phpunittest, phpunit ob_get_contents(), phpunit test methoden

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:39 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum