单元测试你的形式如何

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.3,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

单元测试你的形式如何

表单组件包含3核心对象:一种类型(实现FormTypeInterface),形式FormView

唯一的类,通常是被程序员是作为一种形式的表单类型类蓝图。它是用于生成形式FormView。你可以测试它直接嘲笑与工厂但这将是复杂的相互作用。最好是把它传给FormFactory喜欢它是在真实的应用程序中完成的。这是简单的引导,你可以信任Symfony组件能够使用他们作为测试基地。ob娱乐下载

已经有一个类,你可以受益于简单FormTypes测试:TypeTestCase。它是用来测试的核心类型,您可以使用它来测试你的类型。

请注意

根据你安装Symfony的方式或Symfony形式组件测试可能无法下载。ob娱乐下载使用——prefer-source选择与作曲家如果是这种情况。

最基本的

最简单的TypeTestCase实现看起来像下面的:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35
/ /测试/ AppBundle / /类型/ TestedTypeTest.php形式名称空间测试\AppBundle\形式\类型;使用AppBundle\形式\类型\TestedType;使用AppBundle\模型\TestObject;使用ob娱乐下载\组件\形式\测试\TypeTestCase;TestedTypeTest扩展TypeTestCase{公共函数testSubmitValidData(){美元formData=数组(“测试”= >“测试”,“test2”= >“test2”,);美元形式=美元- >工厂- >创建(TestedType::类);美元对象=TestObject ();/ /……填充对象属性与数据存储在formData美元/ /直接提交表单数据美元形式- >提交(美元formData);美元- >assertTrue (美元形式- >isSynchronized ());美元- >assertequal (美元对象,美元形式- >getData ());美元视图=美元形式- >createView ();美元孩子们=美元视图- >孩子;foreach(中的美元formData)作为美元关键){美元- >assertArrayHasKey (美元关键,美元孩子们);}}}

那么,是什么测试?来了一个详细的解释。

首先验证FormType编译。这包括基本的类继承,buildForm ()解决功能和选项。这应该是你写的第一个测试:

1
美元形式=美元- >工厂- >创建(TestedType::类);

这个测试检查你的数据所使用的变压器形式失败了。的isSynchronized ()方法只是将如果一个数据变压器抛出一个异常:

1 2
美元形式- >提交(美元formData);美元- >assertTrue (美元形式- >isSynchronized ());

请注意

不要测试验证:它是由一个侦听器应用在测试用例不活跃和它依赖于验证配置。相反,单元测试您的自定义直接约束。

接下来,验证表单的提交和映射。下面的测试检查是否所有指定的字段是正确的:

1
美元- >assertequal (美元对象,美元形式- >getData ());

最后,检查的创建FormView。你应该检查所有部件是否你想显示在儿童属性:

1 2 3 4 5 6
美元视图=美元形式- >createView ();美元孩子们=美元视图- >孩子;foreach(中的美元formData)作为美元关键){美元- >assertArrayHasKey (美元关键,美元孩子们);}

试验类型从服务容器

表单可以使用一个服务,它取决于其他服务(如教义实体管理器)。在这些情况下,使用上面的代码不会工作,作为表单组件实例化的表单类型没有任何参数传递给构造函数。

为了解决这个问题,你必须模拟注入的依赖关系,实例化自己的表单类型和使用PreloadedExtension以确保FormRegistry使用创建的实例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
/ /测试/ AppBundle / /类型/ TestedTypeTest.php形式名称空间测试\AppBundle\形式\类型;使用AppBundle\形式\类型\TestedType;使用学说\常见的\持久性\ObjectManager;使用ob娱乐下载\组件\形式\PreloadedExtension;使用ob娱乐下载\组件\形式\测试\TypeTestCase;/ /……TestedTypeTest扩展TypeTestCase{私人美元entityManager;受保护的函数设置(){/ /模拟任何依赖项美元- >entityManager =美元- >createMock (ObjectManager::类);::设置();}受保护的函数getExtensions(){/ /创建一个类型实例的嘲笑依赖性美元类型=TestedType (美元- >entityManager);返回数组(/ /注册与PreloadedExtension类型实例PreloadedExtension (数组(美元类型),数组()));}公共函数testSubmitValidData(){/ /创建一个新的实例,而是中创建/ / getExtensions将使用()。美元形式=美元- >工厂- >创建(TestedType::类);/ /……您的测试}}

添加自定义扩展

它经常发生,你使用一些添加的选项形式的扩展。情况下可能之一ValidatorExtension与它的invalid_message选择。的TypeTestCase只加载核心扩展形式,这意味着一个InvalidOptionsException将提高如果你想测试一个类依赖于其他扩展。的getExtensions ()方法可以返回一个列表的扩展注册:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34
/ /测试/ AppBundle / /类型/ TestedTypeTest.php形式名称空间测试\AppBundle\形式\类型;/ /……使用AppBundle\形式\类型\TestedType;使用ob娱乐下载\组件\形式\扩展\验证器\ValidatorExtension;使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\组件\验证器\ConstraintViolationList;使用ob娱乐下载\组件\验证器\映射\ClassMetadata;使用ob娱乐下载\组件\验证器\验证器\ValidatorInterface;TestedTypeTest扩展TypeTestCase{私人美元验证器;受保护的函数getExtensions(){美元- >验证器=美元- >createMock (ValidatorInterface::类);/ /使用getMock PHPUnit) 5.3或以下()/ / $ this - >验证器= $ this - > getMock (ValidatorInterface::类);美元- >验证器- >方法(“验证”)- >将(美元- >returnValue (ConstraintViolationList ()));美元- >验证器- >方法(“getMetadataFor”)- >将(美元- >returnValue (ClassMetadata(形式::类)));返回数组(ValidatorExtension (美元- >验证器),);}/ /……你的测试}

还可以加载自定义表单类型,形成类型扩展或类型使用的猜测getTypes ()”,()getTypeExtensions”和getTypeGuessers ()方法。

3.3

getTypes (),getTypeExtensions ()getTypeGuessers ()方法在Symfony 3.3中引入的。ob娱乐下载

针对不同的数据的测试

如果你还没有熟悉PHPUnit)数据提供商,这可能是一个很好的机会来使用:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37
/ /测试/ AppBundle / /类型/ TestedTypeTest.php形式名称空间测试\AppBundle\形式\类型;使用AppBundle\形式\类型\TestedType;使用ob娱乐下载\组件\形式\测试\TypeTestCase;TestedTypeTest扩展TypeTestCase{/ * * *@dataProvidergetValidTestData * /公共函数testForm(美元数据){/ /……您的测试}公共函数getValidTestData(){返回数组(数组(“数据”= >数组(“测试”= >“测试”,“test2”= >“test2”),),数组(“数据”= >数组()),数组(“数据”= >数组(“测试”= >,“test2”= >)));}}

上面的代码将运行您的测试三次有3种不同的数据集。这允许解耦测试装置的测试,很容易测试对多个数据集。

你也可以通过另一个论点,如布尔如果表单必须与给定的一组数据同步等。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。