0

このサンプルクラスがあります

class Class
{
    public function getStuff()
    {
        $data = $this->getData('Here');

        $data2 = $this->getData('There');

        return $data . ' ' . $data2;
    }

    public function getData( $string )
    {
        return $string;
    }
}

getStuffメソッドをテストし、getDataメソッドをモックできるようにしたいと思います。

この方法をモックする最良の方法は何でしょうか?

ありがとう

4

1 に答える 1

3

getDataメソッドは、データをロジックから分離して、別のクラスの一部にする必要があると思います。次に、そのクラスのモックをTestClass依存関係としてインスタンスに渡すことができます。

class TestClass
{
  protected $repository;

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

  public function getStuff()
  {
    $data  = $this->repository->getData('Here');
    $data2 = $this->repository->getData('There');

    return $data . ' ' . $data2;
  }
}

$repository = new TestRepositoryMock();
$testclass  = new TestClass($repository);

モックはTestRepositoryインターフェースを実装する必要があります。これは依存性注入と呼ばれます。例えば:

interface TestRepository {
  public function getData($whatever);
}

class TestRepositoryMock implements TestRepository {
  public function getData($whatever) {
    return "foo";
  }
}

インターフェイスを使用してコンストラクターメソッドで強制することの利点は、上記TestClassのように、インターフェイスが定義した特定のメソッドの存在を保証することですgetData()。実装が何であれ、メソッドはそこになければなりません。

于 2013-02-17T15:23:57.433 に答える