【问题标题】:Mocking to multiple Interfaces模拟多个接口
【发布时间】:2011-05-15 14:38:09
【问题描述】:

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

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

我知道我可以像 Mockery::mock('Db_Interface') 那样创建它,它会通过 instanceof Db_Interface 检查。但是如何让它也通过其他接口的检查呢?

@戈登 好的,代码如下:

$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 中的依赖类型是如何强制执行的?
  • 我无法让 var_dump($my_mock instanceof Db_Interface) 打印出“真”。这就是我所需要的
  • @Happy 你能显示一些代码吗?
  • 我编辑了帖子以添加代码
  • @Happy 抱歉,这不是我一直在问的。您如何在 TestSubject 中强制执行依赖项的类型。也就是说,你如何确保 mysql 实际上实现了这些接口。此外,您的 TestSubject 是否需要在两个接口中定义的方法,还是只依赖一个接口中的方法?

标签: php unit-testing mocking


【解决方案1】:

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

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

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

?

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 能否请您为您的答案添加更多上下文。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,这将对提问者和未来的读者都有帮助。
    • @RBT OP 询问如何使用 PHPUnit 模拟多个接口,上面的代码显示了如何做到这一点。
    【解决方案3】:

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

    来源:Mockery README

    【讨论】:

    • 对此有点麻烦,只要确保您传入的参数是一个完整的字符串 (Mockery::mock('interface, interface2'),而不是两个字符串 (Mockery::mock('interface', 'interface2')。以防万一您无法弄清楚为什么它不能正常工作。
    • 我用 Mockery 0.9.4 测试了这个,两个单独的字符串的符号对我有用 (Mockery::mock('interface', 'interface2')
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      相关资源
      最近更新 更多