【问题标题】:How to create a double for an interface, usefully, concisely and legally?如何为界面创建一个双重,有用,简洁和合法?
【发布时间】:2021-10-11 11:31:09
【问题描述】:

我想为接口创建一个测试替身。解决方案必须满足以下所有要求:

  • 必须允许我为接口的某些方法指定自定义配置
  • 必须使用默认存根自动存根所有 REMAINING 方法
  • 不得要求我明确列出我想要默认存根的其余方法
  • 不得要求我使用已弃用的 API,例如 setMethodsExcept([])

目前这在现代 PHPUnit (8+) 中是否可以实现,还是必须放宽上述某些要求?

【问题讨论】:

  • 为了完成你的问题,我强烈建议提供一个示例性接口以及它的实现,它完全满足你的要求,以使你的意思可见,并显示它在普通 PHP 中的样子.也许那时(也许另外显示一个你希望如何测试场景,也许使用伪代码)有可能给出一个具体的答案。 - 不言而喻:接口存根在 Phpunit 中可用:phpunit.readthedocs.io/en/9.5/test-doubles.html

标签: phpunit


【解决方案1】:

TL;DR:只是不要设置任何方法。

$mock = $this->getMockBuilder(MyInterface::class)->getMock();

// That's. Freakin. IT.

$mock->expects($this-any())
    ->method('whatever_but_present_in_interface')
    ->willReturnCallback(function(){ return "YISS!"; });

// It. Just. Works.

在 PHPUnit 世界中关于配置模拟的讨论如此之多,以及在 PHPUnit 8 和 9 中用于配置模拟方法的 API 的大量扩散,人们可能会认为某些“设置”方法的方式是 强制,这些 API 以某种方式“声明”了你想弄乱的方法,如果你不“声明”它们,PHPUnit 不会让你弄乱它们。

嗯,不。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-16
    • 2013-01-14
    • 2010-10-17
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多