我该如何嘲笑PHPUnit中的"坚持原则"集合



有人知道如何嘲笑条令持久集合吗?

当我尝试直接使用PHPUnit和Mockery来模拟类时,我会得到一个异常:

MockeryException: The class DoctrineORMPersistentCollection is marked final a

并且它的方法是不可替代的。标记为final的类可以传递到\Mockery::mock()作为实例化对象来创建部分mock,但前提是ock不接受类型提示检查。

我的研究表明,一旦方法被标记为final,Mockery和/或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:zendProjectzf2vendormockerymockerylibraryMockeryGenerator.php(129) :
eval()'d code on line 43

有人想出一个好办法来嘲笑这个级别的吗

我似乎不可能模拟一个被声明为final的类。然而,也许还有一些希望。由于PersistentCollection同时实现了DoctrineCommonCollectionsCollectionDoctrineCommonCollectionsSelectable,因此可以使用Mockery来模拟实现这两个接口的对象。

Mockery::mock(
'DoctrineCommonCollectionsCollection, DoctrineCommonCollectionsSelectable'
);

我在自己的一个项目中使用过这种方法,效果很好。

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

仿制品

使用Mockery模拟最终类的能力有限:

同样,主要目的是确保mock对象继承用于类型提示的特定类型。有一个例外,即标记为final的类或标记为finally的方法不能被完全嘲笑。在这些情况下,必须使用部分模拟(稍后解释)。

$mock = Mockery::mock('alias:MyNamespaceMyClass');

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

PHPUnit

试图模拟PHPUnit中的最后一个类会在设计中抛出异常。

相关内容

  • 没有找到相关文章

最新更新