2

オブジェクトをコンストラクターに渡すクラスでタイプヒントを使用しています。渡されたオブジェクト (Bar) は、独自の名前空間に存在します。これは、渡されたオブジェクトを偽のオブジェクトと交換するまでは問題ありません (単体テストの目的で)。私のテスト Bar オブジェクトは独自の名前空間に存在し、エラーが (当然のことながら) スローされます。

use Some\Place\Bar
class Foo {
    // Passing a test Bar into here now throws error.
    public function __construct(Bar $bar) {
        $this->bar = $bar;
    }

}

私はPHPが初めてなので、何が可能かわかりません。これを回避する方法はありますか、それともクラスから Type Hinting を削除する必要がありますか (これが私の現在の解決策です)。

4

2 に答える 2

3

いくつかのオプションのうちの 2 つ:

インターフェイス IBar を実装するコンストラクターにオブジェクトを渡します。

 interface IBar{
  function baz();
 }

 class Bar implements IBar{
    function baz(){ return $this->getSomethingExpensiveFromDatabase();}
 }

 class FakeBar implements IBar{
    function baz(){ return "baz";}
 }

 class Foo {
 function __construct(IBar $bar) ...

またはタイプヒントを使用しないでください

function __construct($bar) 

要点は、メソッドの署名は実装に依存してはならず、常にインターフェースに依存してはならないということです。

編集:したがって、インターフェイスをインポートしてから、どこからでも偽のクラスをインポートする必要があります。その後、FakeBar は Bar をモックできます。

于 2013-01-30T22:28:38.503 に答える
1

型ジャグリングはまったく別のものです。ここで示しているのは型ヒントです。同じクラス名を持つが、異なる名前空間に存在するオブジェクトを渡すことはできませんが、メソッドが期待するクラスから継承するクラスからオブジェクトを渡すことはできます。

namespace Testing;
use Some\Place\Bar;
class TestingBar extends Bar {
}

次に、TestingBarのインスタンスをメソッドに渡すことができます。

元のBarクラスとテスト用のBarクラスの両方に同じ名前を使用する場合は、そのうちの1つをエイリアス化する必要があります(ただし、これには反対することをお勧めします)。

namespace Testing;
use Some\Place\Bar as OriginalBar;

class Bar extends OriginalBar {
}
于 2013-01-30T22:35:07.317 に答える