模拟多个接口

5

有没有可能以一种方式模拟一个对象,使其虚假多个接口实现? (注:我正在使用“padraic's mockery” 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

测试对象(TestSubject)中如何强制执行依赖项的类型? - Gordon
我无法让 var_dump($my_mock instanceof Db_Interface) 输出“true”。这就是我需要的。 - HappyDeveloper
@Happy,你能否展示一些代码? - Gordon
我编辑了帖子以添加代码。 - HappyDeveloper
@Happy 抱歉,这不是我一直在问的。您如何强制执行TestSubject中依赖项的类型。也就是说,您如何确保mysql实际上正在实现这些接口。此外,您的TestSubject是否需要在两个接口中定义方法,还是仅依赖于一个接口的方法? - Gordon
@Happy,最好的方法是您能够发布TestSubject类,例如您想要测试的类。 - Gordon
4个回答

19

对于那些偶然遇到这篇文章的人,在Mockery中,你可以调用Mockery::mock('firstInterface, secondInterface');来模拟实现多个接口的对象。

来源:Mockery README


7
有一点问题,确保传递给函数的参数是一个整体字符串(Mockery::mock('interface, interface2'),而不是两个字符串(Mockery::mock('interface', 'interface2')。以防你无法弄清为什么它不能正常工作。 - Nikko
5
我用 Mockery 0.9.4 进行了测试,两个字符串的标识方法对我有效 (Mockery::mock('interface', 'interface2')。 - aimfeld

4

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


3
能否请您在回答中添加更多的上下文信息。仅有代码的答案很难理解。如果您能在帖子中添加更多信息,将有助于提问者和未来的读者。 - RBT
@RBT OP 问如何使用 PHPUnit 模拟多个接口,上面的代码展示了如何实现。 - user487772

2

当问题涉及到phpspec时,此线程会出现!

因此,以下是使用phpspec的方法:

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


0
你需要一个桩件。创建一个实现这两个接口的类。所有方法都返回null。然后用这个桩件创建一个模拟对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接