PHPUnit如何模拟抽象类以满足类型提示要求?
如何模拟抽象Form类以适配get_field_class的类型注解
嘿,你已经找对路子啦!getMockForAbstractClass正是PHPUnit里处理抽象类模拟的正确工具,只要你正确配置模拟实例,就能完美适配get_field_class的类型注解要求。我给你梳理下具体的实现步骤和要点:
1. 正确创建Form抽象类的模拟实例
你需要在测试方法里生成模拟对象,并且针对性地模拟get_errors_for方法(毕竟这是get_field_class唯一调用的方法),示例代码如下:
public function test_get_field_class_behavior() { // 生成Form抽象类的模拟实例,PHPUnit会自动实现未完成的抽象方法(比如process) $form = $this->getMockForAbstractClass(Form::class); // 自定义get_errors_for方法的返回逻辑,按需控制测试场景 $form->method('get_errors_for') ->willReturnMap([ // 场景1:传入'password'时返回错误数组,应该得到'error'类 ['password', ['min_length']], // 场景2:传入'name'时返回null,应该得到空字符串 ['name', null] ]); // 验证有错误的情况 $this->assertEquals('error', get_field_class($form, 'password')); // 验证无错误的情况 $this->assertEquals('', get_field_class($form, 'name')); }
2. 为什么这个方法可行?
getMockForAbstractClass会自动为抽象类中所有未实现的抽象方法(包括你提到的process)生成默认的模拟实现,所以生成的实例完全属于Form类型,完全满足get_field_class的类型注解要求。- 我们只需要额外模拟
get_errors_for方法,因为这是被测试函数实际依赖的逻辑,这样就能精准控制测试的输入和预期输出了。
小提醒
- 确保你的测试类已经正确引入了
Form抽象类的命名空间,不然会找不到类哦。 - 如果
get_errors_for是受保护方法,你可以结合setMethods来指定要模拟的方法,但从你的代码看它是公共方法,所以上面的写法完全没问题。
内容的提问来源于stack exchange,提问作者acobster
相关产品推荐
相关产品推荐

