单元测试你的形式如何
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
单元测试你的形式如何
表单组件包含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
/ / src / Acme / TestBundle /测试/形式/类型/ TestedTypeTests.php名称空间Acme\TestBundle\测试\形式\类型;使用Acme\TestBundle\形式\类型\TestedType;使用Acme\TestBundle\模型\TestObject;使用ob娱乐下载\组件\形式\测试\扩展\核心\类型\TypeTestCase;类TestedTypeTest扩展TypeTestCase{公共函数testBindValidData(){美元formData=数组(“测试”= >“测试”,“test2”= >“test2”,);美元类型=新TestedType ();美元形式=美元这- >工厂- >创建(美元类型);美元对象=新TestObject ();美元对象- >fromArray (美元formData);美元形式- >bind (美元formData);美元这- >assertTrue (美元形式- >isSynchronized ());美元这- >assertequal (美元对象,美元形式- >getData ());美元视图=美元形式- >createView ();美元孩子们=美元视图- >孩子;foreach(中的美元formData)作为美元关键){美元这- >assertArrayHasKey (美元关键,美元孩子们);}}}
那么,是什么测试?让我们逐行解释它。
首先验证FormType
编译。这包括基本的类继承,buildForm
解决功能和选项。这应该是你写的第一个测试:
1 2
美元类型=新TestedType ();美元形式=美元这- >工厂- >创建(美元类型);
这个测试检查你的数据所使用的变压器形式失败了。的isSynchronizedc444b6013d8192175f46a3629bcf456b9074f01afalse ()如果一个数据变压器将抛出一个异常:
1 2
美元形式- >bind (美元formData);美元这- >assertTrue (美元形式- >isSynchronized ());
请注意
不要测试验证:它是由一个侦听器应用在测试用例不活跃和它依赖于验证配置。相反,单元测试您的自定义直接约束。
接下来,验证表单的绑定和映射。下面的测试检查是否所有指定的字段是正确的:
1
美元这- >assertequal (美元对象,美元形式- >getData ());
最后,检查的创建FormView
。你应该检查所有部件是否你想显示在儿童属性:
1 2 3 4 5 6
美元视图=美元形式- >createView ();美元孩子们=美元视图- >孩子;foreach(中的美元formData)作为美元关键){美元这- >assertArrayHasKey (美元关键,美元孩子们);}
添加一个表单类型取决于
表单可能依赖于其他类型被定义为服务。它看起来像这样:
1 2 3 4
/ / src / Acme / TestBundle /形式/类型/ TestedType.php/ /……buildForm方法美元构建器- >add (“acme_test_child_type”);
正确地创建表单,您需要提供类型工厂测试。最简单的方法是手动注册之前创建父窗体:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src / Acme / TestBundle /测试/形式/类型/ TestedTypeTests.php名称空间Acme\TestBundle\测试\形式\类型;使用Acme\TestBundle\形式\类型\TestedType;使用Acme\TestBundle\模型\TestObject;使用ob娱乐下载\组件\形式\测试\扩展\核心\类型\TypeTestCase;类TestedTypeTest扩展TypeTestCase{公共函数testBindValidData(){美元这- >工厂- >addType (新TestChildType ());美元类型=新TestedType ();美元形式=美元这- >工厂- >创建(美元类型);/ /……您的测试}}
谨慎
确保孩子类型添加测试。否则你可能会得到错误无关您正在测试的形式,而是它的孩子。
添加自定义扩展
它经常发生,你使用一些添加的选项形式的扩展。情况下可能之一ValidatorExtension
与它的invalid_message
选择。的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
/ / src / Acme / TestBundle /测试/形式/类型/ TestedTypeTests.php名称空间Acme\TestBundle\测试\形式\类型;使用Acme\TestBundle\形式\类型\TestedType;使用Acme\TestBundle\模型\TestObject;使用ob娱乐下载\组件\形式\测试\扩展\核心\类型\TypeTestCase;类TestedTypeTest扩展TypeTestCase{受保护的函数设置(){父::设置();美元这- >工厂=形式::createFormFactoryBuilder ()- >addTypeExtension (新FormTypeValidatorExtension (美元这- >getMock (“ob娱乐下载Symfony \组件\验证器\ ValidatorInterface”)))- >addTypeGuesser (美元这- >getMockBuilder (“ob娱乐下载Symfony \组件\ \ \验证器\ ValidatorTypeGuesser延伸的形式)- >disableOriginalConstructor ()- >getMock ())- >getFormFactory ();美元这- >调度程序=美元这- >getMock (“ob娱乐下载Symfony \ \ EventDispatcher \ EventDispatcherInterface组件”);美元这- >builder =新FormBuilder (零,零,美元这- >调度程序,美元这- >工厂);}/ /……你的测试}
针对不同的数据的测试
如果你还没有熟悉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 38 39
/ / src / Acme / TestBundle /测试/形式/类型/ TestedTypeTests.php名称空间Acme\TestBundle\测试\形式\类型;使用Acme\TestBundle\形式\类型\TestedType;使用Acme\TestBundle\模型\TestObject;使用ob娱乐下载\组件\形式\测试\扩展\核心\类型\TypeTestCase;类TestedTypeTest扩展TypeTestCase{/ * * *@dataProvidergetValidTestData * /公共函数testForm(美元数据){/ /……您的测试}公共函数getValidTestData(){返回数组(数组(“数据”= >数组(“测试”= >“测试”,“test2”= >“test2”),),数组(“数据”= >数组()),数组(“数据”= >数组(“测试”= >零,“test2”= >零)));}}
上面的代码将运行您的测试三次有3种不同的数据集。这允许解耦测试装置的测试,很容易测试对多个数据集。
你也可以通过另一个论点,如布尔如果表单必须与给定的一组数据同步等。