如何用PHPUnit模拟这些方法?

时间:2013-02-17 15:16:03

标签: unit-testing testing mocking phpunit

我有这个示例类

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

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

        return $data . ' ' . $data2;
    }

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

我希望能够测试getStuff方法并模拟getData方法。

模仿这种方法的最佳方法是什么?

由于

1 个答案:

答案 0 :(得分: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接口。这称为依赖注入。 E.g:

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

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

使用接口并在TestClass构造函数方法中强制执行它的优点是接口保证您定义的某些方法的存在,如上面的getData() - 无论实现是什么,该方法必须在那里。