RaduTodor / TestingPHP

A repository for teaching purposes.
0 stars 0 forks source link

Some tips #1

Open sica07 opened 5 years ago

sica07 commented 5 years ago

1. Strucura cod

Codul trebuie separat pe roluri. Cel mai eficient mod ar fi (pastrand caracterul procedural al codului) sa aveti un director "functions", un director "views/templates/ce_vreti_voi" si un director "tests". Faptul de a avea toate fisierele amestecate incurca enorm. De exemplu, uitandu-ma doar la numele fisierelor, sa zicem ca imi dau seama ca EditPage.php contine codul pentru prezentare, dar care este rolul lui EditProfile.php si cu ce e diferit fata de EditCall.php?
Apropo de EditPage.pjp, preferabil ca fisierele de prezentare/views/layouturi/template-uri, in cazul vostru, sa aiba extensia phtml, nu php.Extensia phtml este parsata ca si orice script php dar avand acest nume (phtml) transmite destul de clar ideea ca contine si cod html. Pe langa toate acestea, inca un argument foarte puternic pentru separarea codului pe roluri este ca nu dorim ca toate fisierele nostre sursa sa fie in folderul public. Vor fi accesibile oricui dibuieste numele fisierelor (incercati sa scrieti in browser: http://localhost/EditProfile.php si vedeti ce se intampla ;) ) Propun structura urmatoare:

Testing_Php\
                    functions\*.php
                    views\*.phtml
                    public\index.php
                              *.css, *.js
                               .htaccess
                    vendor\

2. Testarea codului asa cum este acum (cod procedural)

Se poate testa fara probleme asa cum se prezinta acum insa in cazul asta nu puteti folosi namespacing-ul (use PHPUnit\Framework\TestCase) ci doar require_once. Namespacing-ul se foloseste doar cand avem cod OO. In cazul acesta ati putea face ceva de genul:

require_once "../functions/logOut.php";
require_once "../vendor/phpunit/framework/TestCase.php"; //asta e doar un exemplu, voi puneti path-ul corect
class LogOutTest extends TestCase
{
    public function logOutTest()
    {
        require_once "logOut.php";
        $_SERVER['REQUEST_URI'] = "/loginPage.php";
        logout();
        $this->assertEquals(
            isset($_SESSION),
            FALSE);
       }
}

Nu am testat codul dar teoretic ar trebui sa mearga.

3. Rescrierea codului ca OO

in loc de functions o sa aveti clase. In acest caz veti putea utiliza namespace-urile si veti putea testa codul asa cum este scris in tutorialele de phpunit. In composer nu aveti nevoie de PSR-4 pt autoloading (PSR-4 este un standard de namespacing) ci puteti folosi standardul mai simplu PSR-0. In composer.json veti avea doar:

{
    "autoload": {
        "classmap": [
            "src/" //sau ce nume veti da folderului care contine clasele (stergeti comentariul acesta pt ca jsonul sa fie valid)
        ]
    },
    "require-dev": {
        "phpunit/phpunit": "^7"
    }
}

Nu uitati sa dati apoi composer dumpautoload

sica07 commented 5 years ago

Daca aveti intrebari, scrieti-mi. Succes!

cosminpolifronie commented 5 years ago

Ma intrebam de un lucru: cum s-ar scrie aplicatia asta incat sa afiseze exact acelasi lucru dar sa nu mai abuzam de echo-uri in fisiere php? Mie mi se pare ca e o matzaraie totala, html cu un script php deasupra cu mini scripturi php in proprietatea action.

E foarte greu de urmarit codul acum, dar nu avem niciunul experienta cu web dev in php ca sa stim cum ar trebui lucrat.

sica07 commented 5 years ago

Cel mai simplu ar fi sa folositi ce am facut la laborator pentru partea de framework. Mai exact: