繁体   English   中英

模拟多个接口

[英]Mocking to multiple Interfaces

是否可以通过伪造多个接口实现的方式来模拟对象? (注意:我使用的是“padraic 的嘲讽” https://github.com/padraic/mockery

假设我有一个 Mysql 类,它实现了 Db_Interface 和 Configurable_Interface,我需要模拟它才能测试另一个类。 我想用另一个名字创建一个模拟,而不是 Mysql(因为它将来可能会改变或消失,这就是我们使用接口的原因,对吧?),所以我不想做 Mockery::mock('Mysql') .

我知道我可以像 Mockery::mock('Db_Interface') 一样创建它,它会通过 instanceof Db_Interface 检查。 但是我怎样才能让它通过另一个接口的检查呢?

@Gordon 好的,代码如下:

$m = Mockery::mock('Configurable_Interface');
var_dump($m instanceof Configurable_Interface); // true
var_dump($m instanceof Db_Interface); // false of course, since I don't know how to make a mock implement 2 interfaces

对于任何绊倒这一点的人。 Mockery 中,您可以调用Mockery::mock('firstInterface, secondInterface'); 模拟一个需要实现多个接口的对象。

来源: Mockery README

$this->getMockBuilder(['A', 'B'])->getMock();

当问题是关于 phpspec 时,这个线程就出来了!

所以这里有一种方法可以用 phpspec 做到这一点:

$prophecy = $this->prophesize(InterfaceA::class);
$prophecy->willImplement(InterfaceB::class);

👍

你需要一个存根。 创建一个实现这两个接口的类。 所有带有“返回空值”的方法。 而不是用这个存根创建一个模拟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM