PHPUnit测试do-while循环时如何覆写方法内固定的$batchSize参数
方案1:调整业务代码为可配置模式(最推荐)
将固定写死的$batchSize改为类的可配置属性,不破坏原有业务兼容性,同时满足测试需求:
Class Foo { // 保留默认值1000,生产环境无感知 private int $batchSize; public function __construct(int $batchSize = 1000) { $this->batchSize = $batchSize; } function getContacts() { $skip = 0; do { $apiContacts = $client->getContactsSuppressedSinceDate( $this->getFromTime(), $this->batchSize, $skip ); $skip += $this->batchSize; } while (count((array)$apiContacts) === $this->batchSize); } }
测试时直接传入自定义的批次大小即可:
$foo = new Foo(3); // 后续执行你的测试逻辑即可
方案2:通过反射修改私有属性(无需修改对外接口)
如果不能调整类的构造参数,可以把$batchSize改为类的私有属性,测试时用反射修改属性值:
- 调整业务代码:
Class Foo { private int $batchSize = 1000; function getContacts() { $skip = 0; do { $apiContacts = $client->getContactsSuppressedSinceDate( $this->getFromTime(), $this->batchSize, $skip ); $skip += $this->batchSize; } while (count((array)$apiContacts) === $this->batchSize); } }
- 测试代码中注入自定义批次大小:
$foo = new Foo(); $reflection = new \ReflectionClass($foo); $batchSizeProp = $reflection->getProperty('batchSize'); $batchSizeProp->setAccessible(true); $batchSizeProp->setValue($foo, 3);
方案3:运行时修改局部变量(不推荐)
如果完全不能修改业务代码,可以安装runkit扩展重写方法实现、或者使用uopz扩展修改局部变量,但这种方案依赖PHP扩展,对测试环境要求高,稳定性差,不建议生产测试使用。
测试用例修复提醒
你当前的Mock逻辑中第三次调用的第二个参数写为0是错误的,批次大小始终为3,应该改为$this->equalTo(3),同时第三次返回值建议改为空数组,避免count(stdClass)抛出警告。
内容的提问来源于stack exchange,提问作者strangerpixel
相关产品推荐
相关产品推荐

