如何有效、简洁和合法地为界面创建替身?
How to create a double for an interface, usefully, concisely and legally?
我想为接口创建一个测试替身。解决方案必须满足以下所有要求:
- 必须允许我为接口的某些方法指定自定义配置
- 必须使用默认存根自动存根所有剩余方法
- 不得要求我明确列出我想要默认存根的剩余方法
- 不得要求我使用已弃用的 API,例如
setMethodsExcept([])
目前这在现代 PHPUnit (8+) 中是否可以实现,或者是否必须放宽上述某些要求?
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 不会让您乱用它们。
嗯,没有。
我想为接口创建一个测试替身。解决方案必须满足以下所有要求:
- 必须允许我为接口的某些方法指定自定义配置
- 必须使用默认存根自动存根所有剩余方法
- 不得要求我明确列出我想要默认存根的剩余方法
- 不得要求我使用已弃用的 API,例如
setMethodsExcept([])
目前这在现代 PHPUnit (8+) 中是否可以实现,或者是否必须放宽上述某些要求?
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 不会让您乱用它们。
嗯,没有。