如何单元测试你的表单
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何单元测试你的表单
谨慎
本文适用于创建自定义表单类型.如果您正在使用内置的Symfonob娱乐下载y表单类型或者第三方包提供的表单类型,您不需要对它们进行单元测试。
Form组件由3个核心对象组成:表单类型(实现FormTypeInterface),形式和FormView.
通常由程序员操纵的唯一类是表单类型类,它用作表单蓝图。用于生成形式
和FormView
.您可以通过模拟它与工厂的交互来直接测试它,但这会很复杂。最好像在实际应用程序中那样将它传递给FormFactory。引导很简单,您可以充分信任Symfony组件,将它们用作测试基础。ob娱乐下载
已经有一个类,你可以从测试中受益:TypeTestCase.它用来测试核心类型,你也可以用它来测试你的类型。
请注意
根据您安装Symfony或Symfony Form组件的方式,可能无法下载测试。ob娱乐下载使用——prefer-source
选项与Composer如果是这种情况。
最基本的
最简单的TypeTestCase
实现如下所示:
12 34 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 42 43 44 45 46
/ /测试/形式/类型/ TestedTypeTest.php名称空间应用程序\测试\形式\类型;使用应用程序\形式\类型\TestedType;使用应用程序\模型\TestObject;使用ob娱乐下载\组件\形式\测试\TypeTestCase;类TestedTypeTest扩展TypeTestCase{公共函数testSubmitValidData(){$formData= (“测试”= >“测试”,“test2”= >“test2”,);$模型=新TestObject ();// $formData从表单提交中检索数据;将它作为第二个参数传递$形式=$这->工厂->创建(TestedType::类,$模型);$预期=新TestObject ();/ /……用存储在$formData中的数据填充$object属性//直接向表单提交数据$形式->提交($formData);//该检查确保没有转换失败$这->assertTrue ($形式->isSynchronized ());//当表单提交时,检查$formData是否按预期修改$这->assertequal ($预期,$模型);}公共函数testCustomFormView(){$formData=新TestObject ();/ /……根据需要准备数据//初始数据可以用来计算自定义视图变量$视图=$这->工厂->创建(TestedType::类,$formData)->createView ();$这->assertArrayHasKey (“custom_var”,$视图->var);$这->assertSame (“期望值”,$视图->var (“custom_var”]);}}
那么,它测试什么呢?下面是详细的解释。
首先,验证是否FormType
编译。这包括基本类继承buildForm ()
功能和选项解析。这应该是你编写的第一个测试:
1
$形式=$这->工厂->创建(TestedType::类,$formData);
此测试检查表单使用的数据转换器是否没有失败。的isSynchronized ()方法仅设置为假
如果数据转换器抛出异常:
1 2
$形式->提交($formData);$这->assertTrue ($形式->isSynchronized ());
请注意
不要测试验证:它是由一个在测试用例中不活跃的侦听器应用的,它依赖于验证配置。相反,直接对自定义约束进行单元测试或阅读如何进行单元测试添加自定义扩展在本页的最后一部分。
接下来,验证表单的提交和映射。下面的测试检查所有字段是否正确指定:
1
$这->assertequal ($预期,$formData);
的创建FormView
.你可以检查一个自定义变量是否存在,并将在你的表单主题中可用:
1 2
$这->assertArrayHasKey (“custom_var”,$视图->var);$这->assertSame (“期望值”,$视图->var (“custom_var”]);
提示
使用PHPUnit数据提供程序使用相同的测试代码测试多个表单条件。
谨慎
当你的类型依赖EntityType
,你应该登记DoctrineOrmExtension,这将需要mockManagerRegistry
.
但是,如果不能使用模拟来编写测试,则应该扩展KernelTestCase
而是使用form.factory
服务来创建表单。
注册为服务的测试类型
您的表单可以作为服务使用,因为它依赖于其他服务(例如Doctrine实体管理器)。在这些情况下,使用上述代码是行不通的,因为Form组件只是实例化表单类型,而没有向构造函数传递任何参数。
要解决这个问题,必须模拟注入的依赖项,实例化自己的表单类型并使用PreloadedExtension为了确保FormRegistry
使用创建的实例:
12 34 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 42 43
/ /测试/形式/类型/ TestedTypeTest.php名称空间应用程序\测试\形式\类型;使用应用程序\形式\类型\TestedType;使用学说\持久性\ObjectManager;使用ob娱乐下载\组件\形式\PreloadedExtension;使用ob娱乐下载\组件\形式\测试\TypeTestCase;/ /……类TestedTypeTest扩展TypeTestCase{私人$objectManager;受保护的函数设置(){//模拟任何依赖项$这->objectManager =$这->createMock (ObjectManager::类);父::设置();}受保护的函数getExtensions(){//创建带有模拟依赖项的类型实例$类型=新TestedType ($这->objectManager);返回[//用PreloadedExtension注册类型实例新PreloadedExtension ([$类型], []),];}公共函数testSubmitValidData(){/ /……//不是创建一个新实例,而是在// getExtensions()将被使用。$形式=$这->工厂->创建(TestedType::类,$formData);/ /……您的测试}}
添加自定义扩展
您经常会使用由添加的一些选项形式的扩展.其中一种情况可能是ValidatorExtension
与它的invalid_message
选择。的TypeTestCase
只加载核心表单扩展,这意味着InvalidOptionsException如果试图测试依赖于其他扩展的类,将引发。的getExtensions ()方法返回要注册的扩展名列表:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/ /测试/形式/类型/ TestedTypeTest.php名称空间应用程序\测试\形式\类型;/ /……使用ob娱乐下载\组件\形式\扩展\验证器\ValidatorExtension;使用ob娱乐下载\组件\验证器\验证;类TestedTypeTest扩展TypeTestCase{受保护的函数getExtensions(){$验证器=验证::createValidator ();//或者如果你还需要从注释中读取约束$验证器=验证::createValidatorBuilder ()->enableAnnotationMapping ()->getValidator ();返回[新ValidatorExtension ($验证器),);}/ /……你的测试}
请注意
默认情况下,只有CoreExtension在测试中注册。中Form组件的其他扩展ob娱乐下载Symfony \组件\ \扩展形式
名称空间。
控件也可以加载自定义表单类型、表单类型扩展或类型猜测器getTypes (),getTypeExtensions ()而且getTypeGuessers ()方法。