web-dev-qa-db-ja.com

PHPUnit>コンテナオブジェクトをモックするための最良のアプローチ? (例:$ item-> id)

PHPUnitテストダブルを使用してモデルやライブラリなどをモックしています。しかし、おそらくコンテナオブジェクトの配列を返したい場合は、その方法が最適です。これが私が現在していることです:

/**
* This is just a mock of the response from http client
*/
class Container {
    public $values;

    public function __construct($values) {
        $this->values = $values;
    }

    public function __get($name) {
        return (isset($values[$name])) ? $values[$name] : null;
    }

    public function __set($name, $value) {
        $values[$name] = $value;
    }
}

..それから私のtest *メソッドで私は次のようなことをするかもしれません:

$userMock = new Container(array('id' => 2, 'name'=>'Tom'));
$this->mock
    ->method('find') // called within BaseController
    ->with(2)
    ->willReturn( $userMock );

したがって、PHPUnit tets doublesまたはMockeryを使用してそのようなクラスを作成できるかどうかはわかりませんか?この方法を実行する方が簡単なようですが、これは良いアプローチですか?

1
Martyn

一般的に、あなたは 値オブジェクトをモックする必要はありません (そしてあなたのコンテナオブジェクトは値オブジェクトのように見えます)そしてあなたのアプローチは正しいです。

プロパティにアサーションを書く必要がある場合、私はそれをコードの臭いと見なします。それでも、PHP Unitを使用すると、マジックメソッドをモックできるため、たとえば__set呼び出しをアサートすることも、プロパティの終了値をアサートすることもできます(プロパティをアサートする必要がある場合)それらが読み取られたことを表明する必要がある場合、それはテスト臭です。それらを使用するコードの最終結果を検証する必要があるため、正確な実装ではありません。たとえば、値がどこから取得されたかを検証しないでください。しかし、それがその値で何をしたかを確認してください)

2