yiiカイドを横断してみる リレーション(3/3) - テスト

今回は作成したテーブルにデータを登録し、モデルからDBのデータにアクセス可能かユニットテストを使って検証します。とりあえずテスト概要を読んでおいてください。PHPUnitをインストールしていなければしといてください。

テスト計画

まずどんなテストをするのか決めておきます。今回はモデル間のリレーションが想定どおり働くかどうかを検証します。

  • UserのProfileが取得できること
  • UserからPost(複数)を取得できること
  • Postのauthor(User)を取得できること
  • PostのCategory(複数)を取得できること

テストデータ作成 - フィクスチャマネージャの準備

フィクスチャを参照しつつ、main.php を変更します。毎回変更してますね。
/webapp/protrected/config/main.php

<?php
return array(
	'components'=>array(
		'fixture'=>array(  // components に fixture を加える
			'class'=>'system.test.CDbFixtureManager',
		),
	),
);

テストデータ作成 - フィクスチャを定義する

フィクスチャを定義するを見つつ、テストデータをフィクスチャファイルに書き出します。フィクスチャファイルはprefixを省略せずテーブル名と一致させます。tablePrefixを適用する方法はわからなかった。

/webapp/protected/tests/fixtures/tbl_user.php

<?php
return array(
	'user1'=>array(
		'username'=>'user1',
		'password'=>'user1password',
		'email'=>'user1@test.test',
	),
	'user2'=>array(
		'username'=>'user2',
		'password'=>'user2password',
		'email'=>'user2@test.test',
	),
);

/webapp/protected/tests/fixtures/tbl_profile.php

<?php
return array(
	'user1'=>array(
		'owner_id'=>'1',
		'photo'=>NULL, //file_get_contents
		'website'=>'user1 website',
	),
	'user2'=>array(
		'owner_id'=>'2',
		'photo'=>NULL,  //file_get_contents
		'website'=>'user2 website',
	),
);

/webapp/protected/tests/fixtures/tbl_post.php

<?php
return array(
	'post1'=>array(
		'title'=>'post1 title',
		'content'=>'post1 content',
		'create_time'=>getdate(),
		'author_id'=>1,
	),
	'post2'=>array(
		'title'=>'post2 title',
		'content'=>'post2 content',
		'create_time'=>getdate(),
		'author_id'=>1,
	),
);

/webapp/protected/tests/fixtures/tbl_post_category.php

<?php
return array(
	'post_category_1_1'=>array(
		'post_id'=>'1',
		'category_id'=>'1',
	),
	'post_category_1_2'=>array(
		'post_id'=>'1',
		'category_id'=>'2',
	),
);

/webapp/protected/tests/fixtures/tbl_category.php

<?php
return array(
	'category1'=>array(
		'name'=>'category1',
	),
	'category2'=>array(
		'name'=>'category2',
	),
);

テストケース作成

ユニットテストを参考にしつつ、テストケースを書きます。

/webapp/protected/tests/unit/models/UserTest.php

<?php
class UserTest extends CDbTestCase
{
	public $fixtures=array();

	public function testProfile()
	{
		$user = User::model()->findByPk(1);

		$this->assertNotNull($user);

		// UserのProfileが取得できること
		$this->assertNotNull($user->profile);
		$this->assertEquals("user1 website", $user->profile->website);


	}

	public function testPosts()
	{
		$user = User::model()->findByPk(1);

		$this->assertNotNull($user);

		// Userが登録したPost(複数)を取得できること
		$this->assertEquals(2, count($user->posts));
		$this->assertEquals("post1 title", $user->posts[0]->title);
		$this->assertEquals("post2 title", $user->posts[1]->title);

	}
}

/webapp/protected/tests/unit/models/PostTest.php

<?php
class PostTest extends CDbTestCase
{
	public $fixtures=array();

	public function testAuthor()
	{
		$post = Post::model()->findByPk(1);

		$this->assertNotNull($post);

		// Postのauthor(User)を取得できること
		$this->assertNotNull($post->author);
		$this->assertEquals("user1", $post->author->username);

	}

	public function testCategories()
	{
		$post = Post::model()->findByPk(1);

		$this->assertNotNull($post);

		// PostのCategory(複数)を取得できること
		$this->assertEquals(2, count($post->categories));
		$this->assertEquals("category1", $post->categories[0]->name);
		$this->assertEquals("category2", $post->categories[1]->name);

	}
}

テスト

テストです。次のようにユニットテストを実行しOKとなれば成功です。

>cd webapp\protected\tests
>phpunit unit\models\PostTest.php
PHPUnit 3.5.14 by Sebastian Bergmann.

..

Time: 2 seconds, Memory: 7.00Mb

OK (2 tests, 7 assertions)
>cd webapp\protected\tests
>phpunit unit\models\UserTest.php
PHPUnit 3.5.14 by Sebastian Bergmann.

..

Time: 1 second, Memory: 7.00Mb

OK (2 tests, 7 assertions)