Michal
Michal

Reputation: 753

Stub a method on any instance of object

How can I stub a method of an object that is hardcoded in app? In rspec there is a method allow_any_instance_of.

I can't reverse the dependency, the initialisation of the object should still be hardcoded.

So, I have ClassA

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

It is used in ClassB

namespace App
class ClassB
{
 protected $instanceOfA;

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

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

Upvotes: 0

Views: 289

Answers (1)

astroanu
astroanu

Reputation: 3971

I think this is what you're looking for? a plugable interface? if you change the classB to ClassA on line 33 it will switch to the other class.

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();

Upvotes: 1

Related Questions