בדיקת יחידות

מאחר ומערכת הבדיקות של Yii בנויה על גבי PHPUnit, מומלץ לעבור על דוקומנטציה של PHPUnit קודם בכדי לקבל מושג והבנה ראשונית בנוגע לכתיבת בדיקות. אנו מסכמים את העקרונות הבסיסיים אודות כתיבת בדיקות ב Yii.

בחלק הבא, אנו בעיקר נסביר כיצד לכתוב בדיקות יחידה עבור מחלקות AR. אנו נרחיב את המחלקות שלנו ממחלקת הבסיס CDbTestCase מאחר והיא מספקת תמיכה בקיבוע מסדי הנתונים אשר הצגנו בחלק הקודם.

נניח שאנו רוצים לבדוק את מחלקת המודל Comment בדמו של הבלוג. אנו מתחילים על ידי יצירת מחלקה בשם CommentTest ושמירתו תחת protected/tests/unit/CommentTest.php:

class CommentTest extends CDbTestCase
{
    public $fixtures=array(
        'posts''Post',
        'comments''Comment',
    );
 
    ......
}

במחלקה, אנו מגדירים את המאפיין fixtures למערך הקובע אילו טבלאות קבועות יהיו בשימוש בבדיקה זו. המערך מייצג מיפוי של טבלאות קבועות בבדיקה לבין שמות מחלקות מודלים או שמות טבלאות (לדוגמא מטבלה קבוע posts למחלקת מודל Posts ). זכור, בעת מיפוי לשמות טבלאות קבועות למטרת הבדיקה, אנו צריכים להגדיר קידומת של נקודותיים (:) לשם הטבלה (לדוגמא Post: ) בכדי להבדיל אותו משם מודל המחלקה. ובעת שימוש בשמות של מחלקות מודלים, הטבלאות המדוברות יחשבו כטבלאות בדיקה קבועות. כפי שהסברנו קודם, שמות הטבלאות הקבועות יאופסו למצב ידוע כלשהו בכל פעם שמתודת בדיקה תרוץ.

שמות טבלאות קבועות מאפשרות לנו לגשת למידע הקבוע במתודות בדיקה בדרך מאוד נוחה. הקוד הבא מציג את השימוש האופיני:

// החזרת כל השורות בטבלה הקבועה `Comments`
$comments = $thiscomments;
// החזרת השורה ששמה המקוצר הוא `sample1` בטבלה `Post`
$post = $thisposts['sample1'];
// החזרת אובייקט ה AR המייצג את השורה `sample1`
$post = $thisposts('sample1');

» Note|הערה: במידה וטבלה קבועה הוצהרה על ידי שם הטבלה שלה (לדוגמא 'posts'=»':Post'), אז השימוש השלישי בקוד למעלה הוא אינו תקין מאחר ואין לנו מידע לגבי מחלקת המודל אשר משוייכת לטבלה.

לאחר מכן, אנו כותבים את מתודת ה testApprove בכדי לבדוק את המתודה approve במחלקת המודל Comment. הקוד הוא מאוד ישיר: אנו קודם מוסיפים תגובה שהיא במצב המתנה; לאחר מכן אנו מוודאים שתגובה זו היא במצב המתנה על ידי קבלתה ממסד הנתונים; ולבסוף אנו קוראים למתודת approve ומאמתים שהססטוס השתנה בצורה נכונה.

public function testApprove()
{
    // הוספת תגובה במצב המתנה
    $comment=new Comment;
    $commentsetAttributes(array(
        'content''comment 1',
        'status'Comment::STATUS_PENDING,
        'createTime'time(),
        'author''me',
        'email''me@example.com',
        'postId'$thisposts['sample1']['id'],
    ),false);
    $thisassertTrue($commentsave(false));
 
    // אימות במידה והתגובה באמת במצב המתנה
    $comment=Comment::model()findByPk($commentid);
    $thisassertTrue($comment instanceof Comment);
    $thisassertEquals(Comment::STATUS_PENDING,$commentstatus);
 
    // קריאה למתודה approve  ובדיקת התגובה שהיא נמצאת במצב פעיל
    $commentapprove();
    $thisassertEquals(Comment::STATUS_APPROVED,$commentstatus);
    $comment=Comment::model()findByPk($commentid);
    $thisassertEquals(Comment::STATUS_APPROVED,$commentstatus);
}

«div class="revision"»$Id: test.unit.txt 1745 2010-01-24 14:23:36Z qiang.xue $«/div»