Autor Zpráva
jefitto44
Profil
Ahojte, mám class Article, ktorý vyzerá takto
<?
class Article {

    public function createNewArticle($title, $HTMLtext, $author, $category_id) { // add a new article to DB
        $db = mysqli_connect("localhost", "root", "", "webicon_articles");
        $query = mysqli_query($db, "INSERT INTO articles (title, HTMLtext, author, category_id) VALUES 
                             ('".$title."', '".$HTMLtext."', '".$author."', '".$category_id."')");
        if($query)
            echo "The article was saved...";
        else 
            echo "ERROR! Article wasn't saved";
    }

    public function printArticle($article_id) {
        $db = mysqli_connect("localhost", "root", "", "webicon_articles");
        $query = mysqli_query($db, "SELECT * FROM articles WHERE article_id = ".$article_id);
        $row = mysqli_fetch_assoc($query);
        print "
            Title: <h2>".$row["title"]."</h2>
            <p>".$row["HTMLtext"]."</p>
            <b>Author:</b> ".$row["author"]."<br>
            <b>Category ID:</b> ".$row["category_id"]."
        ";
    }

    static function returnAllArticles() {
        $db = mysqli_connect("localhost", "root", "", "webicon_articles");
        $query = mysqli_query($db, "SELECT * FROM articles");
        print "<table>";
        while($row = mysqli_fetch_object($query)) {
            print "
                <tr><td>".$row->title."
                    <td>".$row->HTMLtext."  
                    <td>".$row->author."
                    <td>".$row->category_id."
                </tr>
            ";
        }
        print "</table>";
    }

}

Skúsme teraz neriešiť, že je to všetko neobjektove a že je to spagetti atď atď...
Potrebujem v PHP Unit napísať test, ktorý by používal túto existujúcu classu a použil by z nej metódu createNewArticle a vytvoril by článok a uložil ho do databázy.

Momentálne test u mňa vyzerá takto:
<?php
class ArticleTest extends PHPUnit_Framework_TestCase {
    public function testCreateNewArticle() {
        $title = "New Article No.1";
        $HTMLtext = "In ac iaculis tellus, id sagittis ex. Donec quis lorem quam. Sed vel sem nec odio gravida lobortis. Suspendisse varius cursus elementum. In nec aliquam ipsum, a vulputate magna. Vivamus hendrerit, nulla id efficitur lobortis, tortor erat ultrices leo, vel molestie nulla erat sed est. Curabitur et tellus sed est fermentum iaculis sed at est.";
        $author = "Issac Newton";
        $category_id = 12;
        $this->createNewArticle($title, $HTMLtext, $author, $category_id);
    }
}
?>

Chyba je, že PHPUnit akosi nepochopil, že chcem v tom teste použiť funkciu, ktorá existuje vnútri "Class Article", ale snaží sa ju hľadať v "class ArticleTest", čo samozrejme nenájde... ako sa to dá spraviť?
juriad
Profil
Musíš v testu vytvořit instanci Article a na ní volat tu metodu. Samotná třida Article by neměla vůbec tušit o existenci databázi ani se snažit cokoli vypisovat. Na tom kusu kódu je špatně snad všechno.
jefitto44
Profil
Áno, nemala by, ale tu tuší, pretože toto je len "sample" kód, ktorý potrebujem na jednu špecifickú vec, nebude to však nič verejne dostupné ani používané, takže nou stres

Čiže klasicky v "testCreateNewArticle" si zavolám že new Article() ?


Aaaa, takto mi to nefunguje...
juriad
Profil
jefitto44:
Ano vytvoříš si instanci:

$a = new Article();
$a->createNewArticle(...);

Ale netuším, jak to chceš testovat, když ta funkce nevrací žádnou hodnotu, ani nevyhazuje výjimku. Mohl bys leda pomocí ob_* funkcí zachytit výstup a v něm hledat řetězec „ERROR!“. Tady vidíš krásu unit testingu - nutí tě psát kód pořádně a ne jako prase.
jefitto44
Profil
Ano a napíše mi to, že class Article doesn't exists...
Testovať to chcem tak, že si potom otvorím phpmyadmin a uvidím, či tam je nový artikel, alebo nie...
xROAL
Profil
jefitto44:
Testovať to chcem tak, že si potom otvorím phpmyadmin a uvidím, či tam je nový artikel, alebo nie...
To si sprav úplne bežný script a spusti ho. Pointa automatizovaných testov je, že sa veci testujú automaticky, bez nutnosti niečo ručne kontrolovať.

Ano a napíše mi to, že class Article doesn't exists...
A includuješ ten súbor s tou triedou?
Alphard
Profil
jefitto44:
Testovať to chcem tak, že si potom otvorím phpmyadmin a uvidím, či tam je nový artikel, alebo nie
To snad ne, co se tady člověk nedozví :-)

PHPUnit má sloužit automatizovaným testům. V tomhle případě bych doporučil vůbec do toho netahat PHPUnit, ale jednoduše si někde v adresáři tests vytvořit script s testem
$a = new Article();
$a->createNewArticle(...);
a ten spustit.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: