12

phpunitを使用して、モックオブジェクトではなくモッククラスを作成する方法はありますか?クラスがコンストラクター(またはどこでも)で処理する必要がある可能性のあるすべてのオブジェクトを明示的に渡す必要なしに、依存性注入を行う方法を探しています。これらすべての場合に「true」を返すもの:

public function testAAAA()
{
  $foo = $this->getMock('foo', array('bar'));
  var_dump(class_exists('foo', false));
  var_dump(method_exists('foo', 'bar'));
  var_dump(method_exists($foo, 'bar'));
}

これは印刷します:

bool(true)
bool(false)
bool(true)

偽の「foo」クラスを正常に作成したが、「bar」メソッドをそれにバインドしなかったことを示します。

私はphpunit3.7.5を使用しています。

4

1 に答える 1

14

私はあなたが実際にこれをしたくないのではないかと思います(PHPUnitのモックビルダーでコンストラクターなどを無効にすることができるので、ドキュメントを参照してください)が、あなたが望むか必要であると仮定すると、これはトリックを行うはずです:

$foo = $this->getMockBuilder('nonexistant')
        ->setMockClassName('foo')
        ->setMethods(array('bar'))
        ->getMock();

    var_dump(class_exists('foo', false));
    var_dump(method_exists('foo', 'bar'));
    var_dump(method_exists($foo, 'bar'));

    $cls = new ReflectionClass('foo');
    var_dump($cls->hasMethod('bar'));

上記で異なる名前(存在しない名前とfoo)を指定する必要がある理由の詳細については正直にわかりませんが、モックされているクラスがまだ存在しない場合のPHPUnitの動作に関係しているようで、setMockClassNameにそのクラスを拡張するクラス。か何か。おそらくバグ/エッジケースを効果的に回避しています-これはライブラリの奇妙な使用法です。あなたは関数だけで同じことをすることができるはずですgetMock、それはただ醜いです。

余談ですが、おそらくphpのリフレクション機能に精通している必要があるようです。これは、世の中で最も強力なリフレクションライブラリではありませんが、かなり優れています。これを使用して、コンストラクター引数と「モデル」ライブラリのプロパティに基づいてクラスの必須フィールドとオプションフィールドに関するメタ情報を生成しました。このメタ情報は、正しいタイプの値を受け入れるフォームを生成するために使用されます。つまり、フォームの対象となるクラスのインスタンスを使用せずに、ばかげた量のコードを手書きせずに型付きフォームを生成します。これは、機能全体で合計約100行です。明らかに、あなたが何をしようとしているのかわかりませんが、あなたの投稿の少量の情報から、それはそうでないよりもそのタイプのメタに近いと思います。

于 2012-11-15T00:55:05.617 に答える