Yii テストフレームワークは PHPUnit 上に構築されているため、単体テストの作成方法を理解する前に PHPUnit ドキュメントを一読することをお勧めします。以下に、Yii で単体テストを作成する基本原則を簡単にまとめます。
単体テストは、CTestCase または CDbTestCase から継承された XyzTest クラスの形式で作成されます。ここで、Xyz はテスト対象のクラスを表します。 Post クラスをテストしたい場合は、それに応じてテスト クラスに PostTest という名前を付けます。基本クラス CTestCase は一般的な単体テスト クラスですが、PHPUnit_Framework_TestCase はこれら 2 つのクラスの親クラスであるため、CDbTestCase は AR モデル クラスのテストにのみ適しています。
を使用すると、このクラスからすべてのメソッドを継承できます。 PHPUnit_Framework_TestCase是这两个类的父类
, 我们可以从这个类中继承所有方法。
单元测试类以XyzTest.php的形式保存在PHP文件中. 方便起见,单元测试文件通常保存在 protected/tests/unit文件夹下
.
测试类主要包含一系列testAbc方法, 其中Abc通常是要被测试的类方法.
测试方法通常包含一系列断言语句 (e.g. assertTrue
, assertEquals
),作为验证目标类行为的断点.
下面我们主要阐述如何为AR模型类编写单元测试. 我们的测试类将会继承自 CDbTestCase,因为它提供了数据库特定状态支持,在上一章节中我们已经详细讨论了数据库特定状态.
假设我们要测试blog案例中的Comment模型类,可以首先创建一个命名为CommentTest的类,然后将它保存为 protected/tests/unit/CommentTest.php
:
class CommentTest extends CDbTestCase { public $fixtures=array( 'posts'=>'Post', 'comments'=>'Comment', ); ...... }
在这个类中, 我们指定成员变量 fixtures
为一个包含这个测试要用到的特定状态(fixtures)数组。这个数组表示从特定状态名称到模型类的映射或者特定状态表名 (e.g. 从 posts
到 Post
). 注意当映射到特定状态表名时,应该在数据表名称前加上冒号前缀 (e.g. <img src="https://img.php.cn/upload/article/000/000/194/d8454295409f69752ae1c667ca9e3c2e-0.gif" alt="Yii Framework 公式ガイド シリーズ サプリメント 39 - テスト: 単体テスト" class="wp-smiley"> ost
)来区别于映射到模型类. 当使用模型类名称时,相应的表将会被看作特定状态表。正如我们之前所描述的 ,当一个测试方法执行后特定状态表每次将会被重置到某些已知的状态。
特定状态名称允许我们在测试方法中以一种很方便的方式访问特定状态数据. 下面的代码展示了典型的使用方法:
// 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');
Note: 如果一个特定状态声明使用它的数据表名 (e.g.
'posts'=>'Yii Framework 公式ガイド シリーズ サプリメント 39 - テスト: 単体テストost'
), 那么上述第三个使用方法将会无效,因为我们已经已经没有任何与模型类的关联信息了.
接下来,我们要编写testApprove方法在Comment模型类中测试approve方法
単体テスト クラスは、XyzTest.php の形式で PHP ファイルに保存されます。通常、単体テスト ファイルは protected/tests/unit フォルダー
に保存されます。
テスト クラスには主に一連の testAbc メソッドが含まれており、Abc は通常テストされるクラス メソッドです。
assertTrue) が含まれています。
、assertEquals
) をブレークポイントとして使用し、対象クラスの動作を検証します 🎜🎜 以下では主に AR モデルの単体テストの書き方について説明します。データベース固有のステータスのサポートを提供するため、テスト クラスは CDbTestCase から継承します。データベース固有のステータスについては、前の章で詳しく説明しました 🎜🎜 ブログ ケースで Comment モデル クラスをテストするとします。まず CommentTest という名前のクラスを作成し、それを protected/tests/unit/CommentTest.php
として保存します:🎜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); }
fixtures
を次のように指定します。このテストで使用される変数を含む 特定のフィクスチャの配列。この配列は、特定の状態名からモデル クラスまたは特定の状態テーブル名へのマッピングを表します (例: posts
から Post
へ)。特定の状態にマッピングする場合に注意してください。テーブル名には、データテーブル名の前にコロンを付ける必要があります (例: <img src="https://img.php.cn/upload/article/000/000/194/d8454295409f69752ae1c667ca9e3c2e-0.gif" alt framework class="wp-smiley"> ost
) を使用して、モデル クラスへのマッピングと区別します。モデル クラス名を使用する場合、対応するテーブルは特定の状態テーブルとして扱われます。前に説明したように、テスト メソッドが実行されるたびに、特定の状態テーブルが既知の状態にリセットされます。 🎜🎜特定の状態名を使用すると、テスト メソッドで非常に便利な方法で特定の状態データにアクセスできます。次のコードは、一般的な使用法を示しています: 🎜rrreee🎜注: 特定の状態宣言でデータ テーブル名 (例: 'posts'=>'Yii Framework 公式ガイド シリーズ サプリメント 39 - テスト: 単体テストost'
) の場合、モデル クラスとは何の関係もなくなるため、上記の 3 番目の使用方法は無効になります 🎜
🎜次に、コメント モデル クラスの承認メソッドをテストするための testApprove メソッド
を記述する必要があります。コードは非常にシンプルで明確です。まずレビュー対象のコメントを挿入し、次に Get を渡します。このレビューコメントを検証するためにデータベースからデータを取得し、最後にapproveメソッドを呼び出してレビューに合格します。 🎜rrreee🎜上記は、Yii Framework 公式ガイド シリーズ サプリメント 39 - テスト: 単体テストの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。 🎜🎜🎜🎜🎜🎜