我如何在PHPUnit中模仿原则PersistentCollection
有人知道如何模仿一个持久的集合吗 当我尝试直接使用PHPUnit和mockry模拟该类时,我得到一个异常,其内容如下:我如何在PHPUnit中模仿原则PersistentCollection,php,unit-testing,doctrine-orm,phpunit,Php,Unit Testing,Doctrine Orm,Phpunit,有人知道如何模仿一个持久的集合吗 当我尝试直接使用PHPUnit和mockry模拟该类时,我得到一个异常,其内容如下: Mockery\Exception: The class Doctrine\ORM\PersistentCollection is marked final a 它的方法是不可替代的。标记为final的类可以传递到\Moc kery::mock()作为实例化对象创建部分mock,但仅当 ock不接受类型提示检查 我的研究表明,一旦这些方法被标记为final,mocky和/或p
Mockery\Exception: The class Doctrine\ORM\PersistentCollection is marked final a
它的方法是不可替代的。标记为final的类可以传递到\Moc
kery::mock()作为实例化对象创建部分mock,但仅当
ock不接受类型提示检查
我的研究表明,一旦这些方法被标记为final,mocky和/或phpUnit就不能使用反射
然后我尝试创建一个stdClass,并为它提供迭代器将使用的方法(valid/current/next),但是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: 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
有没有人想出一个好办法来模拟这个类我似乎不可能模拟一个被宣布为最终类的类。然而,可能还有一些希望。由于
PersistentCollection
同时实现了doctor\Common\Collections\Collection
和doctor\Common\Collections\selective
,因此可以使用mockry来模拟实现这两个接口的对象
Mockery::mock(
'Doctrine\Common\Collections\Collection, Doctrine\Common\Collections\Selectable'
);
我参与了我自己的一个项目
至于你为什么不能模拟期末考试,这是我能找到的最好的答案:
嘲弄
使用mockry模拟最终类的能力是:
同样,主要目的是确保模拟对象继承用于类型暗示的特定类型。有一个例外,即标记为final的类或带有标记为final的方法的类不能完全模拟。在这些情况下,必须使用局部模拟(稍后解释)
$mock = \Mockery::mock('alias:MyNamespace\MyClass');
在链接页面中搜索“final”。你会找到我能找到的所有文档
PHPUnit
试图在PHPUnit中模拟最后一个类。我用一个可能的解决方案更新了我的答案。我自己也使用过这个解决方案,并取得了很好的效果(尽管它与您的情况不同)。