15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【PHPUnit】privateプロパティの値をテスト用に書き換えてテストする

Last updated at Posted at 2017-12-04

そもそもprivateなもののテストを行うこと自体賛否両論あるらしいですけど、
テストは書いておいた方がいいような気がします。(小並感)
そういう場合は標準クラスのReflectionClassを使用する方法があるらしいです。

自分がよく遭遇するパターンとしては、privateプロパティをテスト用の値に書き換えたいとき。
例として以下に記します。

例)
プロパティに設定してあるファイル名が正しい場合は TRUE 、誤ってる場合は FALSE を返すメソッドのテストを行う場合

  • Registerクラス
Register.php
<?php
class Register
{
    /**
    * 登録するファイル名
    * @see  __construct()
    */
    private $registerFile;

    public function __construct()
    {
        $this->registerFile = 'AAA.csv';
    }

    public function check()
    {
        if ($this->registerFile === 'AAA.csv') {
            return true;
        }

        return false;
    }
  
/** 略 **/
  
}

以下のような感じでprivateプロパティを上書きしてやればテストが可能みたいです。(PHPUnit)

  • RegisterTestクラス
RegisterTest.php
<?php

use App\Register;

class RegisterTest extends TestCase
{
    public function test_ファイル名が適切でない場合はFALSEが返ること()
    {
        // テスト対象のクラスをインスタンス化
        $register = new Register();

        // Reflectionクラスをインスタンス化
        $reflectionClass = new ReflectionClass($register);

        // プロパティの値を取得
        $property = $reflectionClass->getProperty('registerFile');

        // privateプロパティのアクセス範囲を設定(trueを指定でアクセスできるようになる)
        $property->setAccessible(true);

        // 取得したプロパティをテスト用に上書き
        $property->setValue($register, 'AAA_test.csv');

        // 上書きしたプロパティでテストを実行
        $this->assertFalse($register->check());
    }

}

参考

15
12
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
15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?