模拟多个接口

时间:2010-11-25 09:48:41

标签: php unit-testing mocking

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

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

我知道我可以像Mockery :: mock('Db_Interface')一样创建它,它会传递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

4 个答案:

答案 0 :(得分:19)

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

来源:Mockery README

答案 1 :(得分:3)

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

答案 2 :(得分:1)

当有关phpspec的问题时,此线程出现!

所以这是使用phpspec的一种方法:

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

?

答案 3 :(得分:0)

你需要一个存根。创建一个实现2个接口的类。所有带“return null”的方法。而不是用这个存根创建一个模拟。