PHPUnit Doctrine Repository魔术方法

时间:2018-03-13 12:56:11

标签: symfony doctrine-orm phpunit tdd

我需要一些帮助才能完全测试依赖于Doctrine的课程。

我的类中有一个方法,它使用Doctrine EntityRepository 中的 magic 方法 findOneBy ... ,如下所示:< / p>

enter image description here

但是当我进行测试时,我总是有这个警告:

enter image description here

我该如何模拟那个电话?下面我介绍 EntityManager magic __call方法应该如何工作:

enter image description here

2 个答案:

答案 0 :(得分:0)

我认为您可以使用真实方法findOneBy(array('XXXX'=&gt;'identifier'))替换魔法方法findOneByXXXX('identifier')。

也就是说:

$this->shopUrlRepository->findOneByIdShopUrl($this->shop->getId());

要:

$this->shopUrlRepository->findOneBy(array('IdShopUrl' => $this->shop->getId()));

这是一种真正的方法。 Doctrine documentation

我希望这可以帮到你。

答案 1 :(得分:0)

你可以模拟在调用不可能的方法时调用的魔术方法__call

$mock
    ->expects($this->once())
    ->method('__call')
   ->with(
      $this->equalTo('findOneByIdShopUrl'), //
      $this->equalTo(['5'])
   )
   ->willReturn(['shop' => 'shop info']); // return shop object

同时检查http://php.net/manual/en/language.oop5.overloading.php#object.call

另一种选择是使用setMethods()

$this->getMockBuilder('ShopRepository')->setMethods(['findOneByShopId'])->getMock(); 

然后使用诸如will等方法的其余逻辑