gpt4 book ai didi

php - 如何在 PHPUnit 中模拟 Doctrine PersistentCollection

转载 作者:行者123 更新时间:2023-12-01 02:20:32 25 4
gpt4 key购买 nike

有谁知道如何模拟 Doctrine PersistentCollection?

当我尝试使用 PHPUnit 和 Mockery 直接模拟类时,我得到一个异常,内容如下:

Mockery\Exception: The class Doctrine\ORM\PersistentCollection is marked final a

nd它的方法是不可替代的。标记为 final 的类可以传递给\Moc
kery::mock() 作为实例化对象来创建部分模拟,但前提是 m
ock 不受类型提示检查的影响。

我的研究表明,一旦方法被标记为 final,Mockery 和/或 phpUnit 就不能使用反射。

然后我尝试创建一个 stdClass 并为其提供迭代器将使用的方法(有效/当前/下一个),但除非该类实现迭代器,否则 foreach 循环不会调用这些方法。

因此,以下代码不起作用...
$this -> collectionMock = \Mockery::mock('PersistentCollection, Traversable');
$this -> collectionMock -> shouldReceive('rewind');
$this -> collectionMock -> shouldReceive('valid') -> andReturn('true');
$this -> collectionMock -> shouldReceive('next');
$this -> collectionMock -> shouldReceive('current') ->andReturn();

并且 throws 似乎抛出了以下 fatal error :
Fatal error: Cannot redeclare Mockery_1670979900_PersistentCollection_Traversable::rewind() 
in C:\zendProject\zf2\vendor\mockery\mockery\library\Mockery\Generator.php(129) :
eval()'d code on line 43

有没有人想出一个模拟这个类的好方法

最佳答案

我似乎不可能模拟一个已被宣布为 final 的类。然而,可能会有一些希望。由于PersistentCollection实现Doctrine\Common\Collections\CollectionDoctrine\Common\Collections\Selectable ,您可以使用 Mockery 来模拟实现这两个接口(interface)的对象。

Mockery::mock(
'Doctrine\Common\Collections\Collection, Doctrine\Common\Collections\Selectable'
);

我有 used this to good effect在我自己的一个项目中。

至于为什么你不能模拟最后一个类,这是我能找到的最好的:

mock

使用 Mockery 模拟 final类的能力是 limited :

Again, the primary purpose is to ensure the mock object inherits a specific type for type hinting. There is an exception in that classes marked final, or with methods marked final, cannot be mocked fully. In these cases a partial mock (explained later) must be utilised.

$mock = \Mockery::mock('alias:MyNamespace\MyClass');


在链接页面中搜索“最终”。你会找到我能找到的所有文档。

PHPUnit

试图在 PHPUnit 中模拟最终类 throws an exception by design .

关于php - 如何在 PHPUnit 中模拟 Doctrine PersistentCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20829791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com