gpt4 book ai didi

PHPUnit:模拟 Symfony2 FormBuilderInterface - 类型提示问题

转载 作者:行者123 更新时间:2023-12-04 05:16:46 25 4
gpt4 key购买 nike

我正在尝试测试一个扩展 Symfony\Component\Form\AbstractType 的类,并且无法测试所需的 buildForm带有 PHPUnit 模拟对象的方法:

class PageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', 'text');
}

// ...
}

这是一些示例测试代码:
public function testBuildForm()
{
$form = new PageType($this->manager);
$formBuilder = $this->getMock('Symfony\Component\Form\FormBuilderInterface');
$form->buildForm($formBuilder, array());
}

不幸的是,调用 getMock()失败:
PHP Fatal error:  Class Mock_FormBuilderInterface_f36f83d4 must implement interface Traversable as part of either Iterator or IteratorAggregate in Unknown on line 0

我怀疑我可能已经犯了这个错误:
https://github.com/sebastianbergmann/phpunit/issues/604

所以,我创建了一个界面来解决这个问题:
use Symfony\Component\Form\FormBuilderInterface;

interface FormBuilderInterfaceExtender extends \Iterator, FormBuilderInterface
{
}

并更改了我的测试代码:
public function testBuildForm()
{
$form = new PageType($this->manager);
$formBuilder = $this->getMock('Pwn\ContentBundle\Tests\Helper\FormBuilderInterfaceExtender');
$form->buildForm($formBuilder, array());
}

现在我有一个 FormBuilder 实例,但 PHP 不认为它是 Symfony\Component\Form\FormBuilderInterface 的实例。 ,所以 $form->buildForm() 中的类型提示给出这个错误:
Argument 1 passed to Pwn\ContentBundle\Form\Type\PageType::buildForm() must be an instance of Symfony\Component\Form\FormBuilderInterface, instance of Mock_FormBuilderInterfaceExtender_3527f313 given

在其他情况下,当我使用模拟对象时,键入提示和 instanceof工作正常,但在这里它没有:
var_dump($formBuilder);
var_dump($formBuilder instanceof \Symfony\Component\Form\FormBuilderInterface);


class Mock_FormBuilderInterfaceExtender_76df04af#19 (1) {
private $__phpunit_invocationMocker =>
NULL
}
bool(false)

看来我可以通过模拟一个实现接口(interface)的类来完成这项工作:
$formBuilder = $this->getMockBuilder('Symfony\Component\Form\FormBuilder')
->disableOriginalConstructor()
->getMock();

var_dump($formBuilder instanceof \Symfony\Component\Form\FormBuilderInterface);
// ^ gives bool(true)

但是,我应该能够使用界面本身吗?为什么扩展接口(interface)会“丢失”类型提示?

最佳答案

每当您无法测试 Symfony2 接口(interface)时,请查看组件的 Tests 目录,看看是否有专门用于测试的 mock。测试接口(interface)扩展了真实接口(interface),并添加了使 phpunit 运行它们所需的任何调整。

在您的情况下,请尝试模拟 Symfony\Component\Form\Tests\FormBuilderInterface反而。

关于PHPUnit:模拟 Symfony2 FormBuilderInterface - 类型提示问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14161507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com