0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プロパティの中身が決まっていない抽象的な親クラスのテストを行う方法

Posted at

親クラスにはプロパティ名だけ定義しておいて値は子クラスで定義したい、というパターンがありました。

例えばEntityオブジェクトを詰め込んでcollectionにするためのクラスがあるとして、

class EntityCollection {
	protected $entityName;

	public function __construct(array $entities)
	{
		foreach ($entities as $entity) {
			if (!($entity instanceof $this->entityName)) {
				throw new Exception();
			}
		}
	}

	public function getById($id)
	{
		// $idで指定したentityを一つ取得する
	}
}

class UserEntityCollection {
	protected $entityName = UserEntity::class;
}

EntityCollectionのテストをしたいが親クラス自体はentityが定まっていないのでこのままではテストができません。
かと言って$entityNameをpublicにすると値を上書きできてしまうのでやりたくありません。

そこでテスト内で親クラスを継承した無名クラスを作ります。

class EntityCollectionTest
{
	public function testGetById()
	{
		$userEntity = new UserEntity(); // ここは任意のEntityを使用する (1)
		$testClass = new class($userEntity) extends EntityCollection {
			$entityName = UserEntity::class; // (1) のクラス名を指定
		}
	}
}

(new EntityCollectionTest)->testGetById();

こうすればテストの時だけ好きなentityNameを定義できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?