מאחר ומערכת הבדיקות של Yii בנויה על גבי PHPUnit, מומלץ לעבור על דוקומנטציה של PHPUnit קודם בכדי לקבל מושג והבנה ראשונית בנוגע לכתיבת בדיקות. אנו מסכמים את העקרונות הבסיסיים אודות כתיבת בדיקות ב Yii.
בדיקת יחידה נכתבת במונחים של מחלקה XyzTest
היורשת ממחלקת הבסיס CTestCase או CDbTestCase. כש Xyz
הינה המחלקה שאותה בודקים. לדוגמא, בכדי לבדוק את המחלקה Post
, אנו נקרא ליחידת הבדיקה כ PostTest
לפי המוסכמות. המחלקה הבסיסית CTestCase נועדה לבדיקות יחידה כלליות, והמחלקה הבסיסית CDbTestCase תואמת לבדיקת מחלקות AR. בגלל ש PHPUnit_Framework_TestCase
הינה מחלקת אב לשני המחלקות, אנו יכולים להשתמש בכל המתודות של מחלקה זו.
מחלקת בדיקת היחידה נשמרת בקובץ PHP בשם XyzTest.php
. לפי המוסכמות, ניתן לשמור את קובץ הבדיקה תחת התיקיה protected/tests/unit
.
מחלקת הבדיקה מכילה בעיקר סט של מתודות בשם testAbc
, כש Abc
בדרך כלל הינו שם מתודת המחלקה לבדיקה.
מתודת בדיקה בדרך כלל מכילה רצף של ביטויי בדיקות (לדוגמא assertTrue
, assertEquals
) המשרתות כנקודות ביקורת לבדיקת התנהגות של המחלקה.
בחלק הבא, אנו בעיקר נסביר כיצד לכתוב בדיקות יחידה עבור מחלקות 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 = $this-»comments;
// החזרת השורה ששמה המקוצר הוא `sample1` בטבלה `Post`
$post = $this-»posts['sample1'];
// החזרת אובייקט ה AR המייצג את השורה `sample1`
$post = $this-»posts('sample1');
» Note|הערה: במידה וטבלה קבועה הוצהרה על ידי שם הטבלה שלה (לדוגמא 'posts'=»':Post'
), אז השימוש השלישי בקוד למעלה הוא אינו תקין מאחר ואין לנו מידע לגבי מחלקת המודל אשר משוייכת לטבלה.
לאחר מכן, אנו כותבים את מתודת ה testApprove
בכדי לבדוק את המתודה approve
במחלקת המודל Comment
. הקוד הוא מאוד ישיר: אנו קודם מוסיפים תגובה שהיא במצב המתנה; לאחר מכן אנו מוודאים שתגובה זו היא במצב המתנה על ידי קבלתה ממסד הנתונים; ולבסוף אנו קוראים למתודת approve
ומאמתים שהססטוס השתנה בצורה נכונה.
public function testApprove()
{
// הוספת תגובה במצב המתנה
$comment=new Comment;
$comment-»setAttributes(array(
'content'=»'comment 1',
'status'=»Comment::STATUS_PENDING,
'createTime'=»time(),
'author'=»'me',
'email'=»'me@example.com',
'postId'=»$this-»posts['sample1']['id'],
),false);
$this-»assertTrue($comment-»save(false));
// אימות במידה והתגובה באמת במצב המתנה
$comment=Comment::model()-»findByPk($comment-»id);
$this-»assertTrue($comment instanceof Comment);
$this-»assertEquals(Comment::STATUS_PENDING,$comment-»status);
// קריאה למתודה approve ובדיקת התגובה שהיא נמצאת במצב פעיל
$comment-»approve();
$this-»assertEquals(Comment::STATUS_APPROVED,$comment-»status);
$comment=Comment::model()-»findByPk($comment-»id);
$this-»assertEquals(Comment::STATUS_APPROVED,$comment-»status);
}
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.