单元测试你的形式如何
编辑该页面单元测试你的形式如何
谨慎
本文的目的是开发人员创建自定义表单类型。如果您正在使用内置Symfonyob娱乐下载形式类型或第三方提供的表单类型包,你不需要单元测试。
表单组件包含3核心对象:一种类型(实现FormTypeInterface),形式和FormView。
唯一的类,通常是被程序员是作为一种形式的表单类型类蓝图。它是用于生成形式
和FormView
。你可以测试它直接嘲笑与工厂但这将是复杂的相互作用。最好是把它传给FormFactory喜欢它是在真实的应用程序中完成的。更容易引导足够和你可以信任Symfony组件使用它们作为一个测试基地。ob娱乐下载
已经有一个类,你可以受益于测试: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 36 37 38 39 40 41 42 43 44 45 46
/ /测试/形式/类型/ TestedTypeTest.php名称空间应用程序\测试\形式\类型;使用应用程序\形式\类型\TestedType;使用应用程序\模型\TestObject;使用ob娱乐下载\组件\形式\测试\TypeTestCase;类TestedTypeTest扩展TypeTestCase{公共函数testSubmitValidData(){美元formData= (“测试”= >“测试”,“test2”= >“test2”,);美元模型=新TestObject ();/ /美元模型将检索表单提交的数据;把它作为第二个参数美元形式=美元这- >工厂- >创建(TestedType::类,美元模型);美元预期=新TestObject ();/ /……填充预期属性与数据存储在formData美元/ /直接提交表单数据美元形式- >提交(美元formData);/ /这个检查确保没有转换失败美元这- >assertTrue (美元形式- >isSynchronized ());/ /检查$模型修改表单被提交时如预期美元这- >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,这将需要模拟ManagerRegistry
。
然而,如果你不能使用模拟写你的测试,你应该延长KernelTestCase
相反,使用form.factory
服务创建表单。
测试类型注册为服务
表单可以使用一个服务,它取决于其他服务(如教义实体管理器)。在这些情况下,使用上面的代码不会工作,作为表单组件实例化类型没有任何参数传递给构造函数。
为了解决这个问题,你必须模拟注入的依赖关系,实例化自己的表单类型和使用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 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 ()方法可以返回一个列表的扩展注册:
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日
/ /测试/形式/类型/ TestedTypeTest.php名称空间应用程序\测试\形式\类型;/ /……使用ob娱乐下载\组件\形式\扩展\验证器\ValidatorExtension;使用ob娱乐下载\组件\验证器\验证;类TestedTypeTest扩展TypeTestCase{受保护的函数getExtensions(){美元验证器=验证::createValidator ();/ /或者如果您还需要读约束注释美元验证器=验证::createValidatorBuilder ()- >enableAnnotationMapping (真正的)- >addDefaultDoctrineAnnotationReader ()- >getValidator ();返回(新ValidatorExtension (美元验证器),);}/ /……你的测试}
请注意
默认情况下只CoreExtension注册测试。你可以找到其他扩展的表单组件ob娱乐下载Symfony \组件\ \扩展形式
名称空间。
还可以加载自定义表单类型,形成类型扩展或类型使用的猜测getTypes (),getTypeExtensions ()和getTypeGuessers ()方法。