2016-06-23 16 views
0

アプリケーションでハードコードされたオブジェクトのメソッドをスタブするにはどうすればよいですか? rspecにはメソッドallow_any_instance_ofがあります。オブジェクトのインスタンスにメソッドをスタブします

依存関係を元に戻すことはできませんが、オブジェクトの初期化はまだハードコードされているはずです。

ので、私はにClassA

namespace App 
class ClassA 
{ 
    public function doSomething(){ 
    // more code 
    return($sth); 
    } 
} 

を持っていることは、私は、これはあなたが探しているものだと思いますClassBの

namespace App 
class ClassB 
{ 
protected $instanceOfA; 

public function __construct(){ 
    $this->instnaceOfA = new ClassA();  
} 

public function methodToTest(){ 
    $result = $this->instanceOfA->doSomething() 
    // more code 
} 
} 
+0

新しいReflectionClass? – astroanu

+0

私が見るところでは、ReflectionClassはクラスに関する情報を読み込み、クラス自体を変更する必要があります。私は何年もPHPをやっていません。 – Michal

+0

いくつかのコードを投稿し、例を挙げます。 – astroanu

答えて

1

に使用されていますか?プラグイン可能なインターフェースですか? 33行目でClassBをClassAに変更すると、他のクラスに切り替わります。

Interface TheInterface 
{ 
    public function doSomething(); 
} 

class ClassA implements TheInterface 
{ 
    public function doSomething(){ 
    echo __METHOD__; 
    } 
} 

class ClassB implements TheInterface 
{ 
    public function doSomething(){ 
    echo __METHOD__; 
    } 
} 

class ClassProcess 
{ 
protected $instance; 

public function __construct(TheInterface $class){ 
    $this->instance = $class;  
} 

public function methodToTest(){ 
    $this->instance->doSomething(); 
} 
} 

$process = new ClassProcess(new ClassB()); 
$process->methodToTest(); 
+0

いいえ、正確ではありません:) 既に初期化されたオブジェクトのレスポンスを指定します。 Ruby&Pythonでは数行のコードしかありません。 PHPでクラスを変更して、すでに初期化されたこのクラスのインスタンスも変更されるようにすることは可能ですか? – Michal

+0

@Michal core PHPは、リフレクションを使ってもそれを行うことはできません。 Rubyのように猿のパッチを当てるために作られたものではありません。しかし、本当に望むなら、runkit拡張を使うことができます:http://php.net/manual/en/function.runkit-method-add.php –

関連する問題