【发布时间】:2018-10-06 12:40:17
【问题描述】:
我正在尝试测试一个辅助函数,它采用 Form 的一些实例,这是一个具有单个抽象方法 process 的抽象类(实际上并不是从测试函数调用的)。
function get_field_class(Form $form, $field) {
return $form->get_errors_for($field) ? 'error' : '';
}
我的问题是,我怎样才能模拟抽象 Form 类,以便它被 get_field_class 的类型注释所接受?
我试过直接传递模拟实例:
$form = $this->getMockForAbstractClass(Form::class)
->method('process')
->will($this->returnValue(true));
$this->assertEquals('error', $this->wrapper->get_field_class($form, 'foo'));
这会引发 TypeError:参数 1...必须是 Form 的实例,给定的 PHPUnit\Framework\MockObject\Builder\InvocationMocker 实例
我已尝试明确设置模拟类名称:
$form = $this->getMockBuilder(Form::class)
->setMockClassName(Form::class)
->getMockForAbstractClass(Form::class)
// ...
这会引发警告“表单”类已存在。 (警告被提升为我的配置中的异常或错误,因此这不是可接受的解决方案。)
我试过禁用自动加载(也许 phpunit 出于某种原因急切地加载 Form 类??):
$form = $this->getMockBuilder(Form::class)
->disableAutoload()
->setMockClassName(Form::class)
->getMockForAbstractClass(Form::class)
// ...
这只是抛出警告:Class "Form" 不存在。
【问题讨论】: