Étant donné que le framework de test Yii est construit sur PHPUnit, il est recommandé de lire la documentation PHPUnit avant de comprendre comment écrire un test unitaire. Ci-dessous nous résumons brièvement les principes de base de l'écriture d'un test unitaire dans Yii :
Un test unitaire est écrit sous la forme de la classe XyzTest héritée de CTestCase ou CDbTestCase, où Xyz représente le test Par exemple, si nous voulons tester la classe Post, nous nommerons la classe de test PostTest en conséquence. La classe de base CTestCase est une classe de test unitaire générale, tandis que CDbTestCase ne convient que pour tester les classes de modèles AR. , nous pouvons partir de là. Toutes les méthodes sont héritées dans la classe. PHPUnit_Framework_TestCase是这两个类的父类
.protected/tests/unit文件夹下
), comme point d'arrêt pour vérifier le comportement de la classe cible assertTrue
assertEquals
Supposons que nous voulions tester la classe de modèle Comment dans le cas du blog, nous pouvons. créez d'abord une classe nommée CommentTest, puis enregistrez-la sous
:protected/tests/unit/CommentTest.php
class CommentTest extends CDbTestCase { public $fixtures=array( 'posts'=>'Post', 'comments'=>'Comment', ); ...... }
à fixtures
. Notez que lors du mappage à un nom de table d'état spécifique, le nom de la table de données doit être préfixé). avec deux points (par exemple posts
) pour le distinguer du mappage vers une classe de modèle. Lors de l'utilisation d'un nom de classe de modèle, la table correspondante sera traitée comme une table d'état spécifique. Comme nous l'avons décrit précédemment, une certaine table d'état sera réinitialisée à un état connu à chaque fois qu'une méthode de test est exécutée. Post
<img src="https://img.php.cn/upload/article/000/000/194/d8454295409f69752ae1c667ca9e3c2e-0.gif" alt="Supplément 39 de la série de guides officiels du Yii Framework - Tests : tests unitaires" class="wp-smiley"> ost
Les noms d'état spécifiques nous permettent d'accéder à des données d'état spécifiques de manière très pratique dans les méthodes de test. Le code suivant montre une utilisation typique :
// return all rows in the 'Comment' fixture table $comments = $this->comments; // return the row whose alias is 'sample1' in the `Post` fixture table $post = $this->posts['sample1']; // return the AR instance representing the 'sample1' fixture data row $post = $this->posts('sample1');
Remarque : <.> Si une déclaration d'état spécifique utilise son nom de table de données (par exemple), alors la troisième méthode d'utilisation ci-dessus sera invalide car nous n'avons plus d'informations associées à la classe de modèle
. Le code est très simple et clair : nous insérons d'abord un commentaire à réviser ; puis nous vérifions ce commentaire de révision en récupérant les données de la base de données et enfin nous appelons la méthode d'approbation et réussissons la révision ;'posts'=>'Supplément 39 de la série de guides officiels du Yii Framework - Tests : tests unitairesost'
. Ensuite, nous devons écrire
testApprove方法在Comment模型类中测试approve方法
Ce qui précède est le contenu du supplément 39 de la série de guides officiels du Yii Framework - Tests : tests unitaires Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (m.sbmmt.com) !
public function testApprove() { // insert a comment in pending status $comment=new Comment; $comment->setAttributes(array( 'content'=>'comment 1', 'status'=>Comment::STATUS_PENDING, 'createTime'=>time(), 'author'=>'me', 'email'=>[email protected]', 'postId'=>$this->posts['sample1']['id'], ),false); $this->assertTrue($comment->save(false)); // verify the comment is in pending status $comment=Comment::model()->findByPk($comment->id); $this->assertTrue($comment instanceof Comment); $this->assertEquals(Comment::STATUS_PENDING,$comment->status); // call approve() and verify the comment is in approved status $comment->approve(); $this->assertEquals(Comment::STATUS_APPROVED,$comment->status); $comment=Comment::model()->findByPk($comment->id); $this->assertEquals(Comment::STATUS_APPROVED,$comment->status); }