hostnet / symfony-config-test
测试与Symfony配置组件相关的用户类库
Requires
- php: ^7.0
- phpunit/phpunit: ^6.0 || ^7.0
- symfony/config: ^2.3 || ^3.0 || ^4.0
This package is auto-updated.
Last update: 2020-04-19 10:51:54 UTC
README
重要:该包不再维护,请考虑使用原始源代码:[https://github.com/SymfonyTest/SymfonyConfigTest](https://github.com/SymfonyTest/SymfonyConfigTest)。
SymfonyConfigTest
作者:Matthias Noback
使用Symfony配置组件编写配置类可能相当困难。为了帮助您验证结果配置节点树的正确性,该库提供了一个PHPUnit测试用例和一些自定义断言。
安装
使用Composer
php composer.phar require --dev matthiasnoback/symfony-config-test
用法
创建一个测试用例并使用来自 Matthias\SymfonyConfigTest\PhpUnit\ConfigurationTestCaseTrait
的特性。然后实现 getConfiguration()
<?php class ConfigurationTest extends \PHPUnit_Framework_TestCase { use ConfigurationTestCaseTrait; protected function getConfiguration() { return new Configuration(); } }
测试无效的配置值
假设您想测试的 Configuration
类看起来像这样
<?php use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; class ConfigurationWithRequiredValue implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('root'); $rootNode ->isRequired() ->children() ->scalarNode('required_value') ->isRequired() ->end() ->end(); return $treeBuilder; } }
当您为这个配置提供空数组作为值时,您会期望一个异常,因为 required_value
节点是必需的。您可以使用 assertConfigurationIsInvalid()
方法来断言给定的配置值集是无效的
<?php class ConfigurationTest extends \PHPUnit_Framework_TestCase { use ConfigurationTestCaseTrait; public function testValuesAreInvalidIfRequiredValueIsNotProvided() { $this->assertConfigurationIsInvalid( array( array() // no values at all ), 'required_value' // (part of) the expected exception message - optional ); } }
测试处理后的配置值
您可能还想验证在处理配置值数组后,结果将符合预期
<?php class ConfigurationTest extends \PHPUnit_Framework_TestCase { use ConfigurationTestCaseTrait; public function testProcessedValueContainsRequiredValue() { $this->assertProcessedConfigurationEquals(array( array('required_value' => 'first value'), array('required_value' => 'last value') ), array( 'required_value'=> 'last value' )); } }
请注意:每个 assert*
方法的第一个参数是一个 数组数组。额外的嵌套级别允许您测试合并过程。请参阅配置组件文档的合并选项部分。
测试配置树的子集
使用这个库,您可以只测试配置树的某个分支。考虑以下节点树定义,它包含 array_node_1
和 array_node_2
分支
<?php use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; class ConfigurationWithTwoBranches implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('root'); $rootNode ->children() ->arrayNode('array_node_1') ->isRequired() ->children() ->scalarNode('required_value_1') ->isRequired() ->end() ->end() ->end() ->arrayNode('array_node_2') ->isRequired() ->children() ->scalarNode('required_value_2') ->isRequired() ->end() ->end() ->end() ->end(); return $treeBuilder; } }
如果您只想测试下面的示例中的 array_node_1
分支,并忽略 array_node_2
,请将 array_node_1
作为测试辅助函数的 $breadcrumbPath
参数的参数提供,例如
/** * @test */ public function processed_configuration_for_array_node_1() { $this->assertProcessedConfigurationEquals( array( array('array_node_1' => array('required_value_1' => 'original value')), array('array_node_1' => array('required_value_1' => 'final value')) ), array( 'array_node_1' => array( 'required_value_1' => 'final value' ) ), // the path of the nodes you want to focus on in this test: 'array_node_1' ); }
这将在 array_node_2
分支中的任何值上触发没有验证错误。
请注意,$breadcrumbPath
可以更加具体,例如 "doctrine.orm"
(这将跳过分支 "doctrine.dbal"
等的配置处理)。
请注意,您只能使用 .
在面包屑路径中遍历数组节点。面包屑路径的最后一部分可以是任何其他类型的节点。
测试原型配置树的子集
您可以使用面包屑路径中的名称为 *
来遍历原型数组节点。
<?php use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; class PrototypedConfiguration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('root'); $rootNode ->children() ->arrayNode('array_node') ->useAttributeAsKey('name') ->prototype('array') ->children() ->scalarNode('default_value')->cannotBeEmpty()->defaultValue('foobar')->end() ->scalarNode('required_value')->isRequired()->end() ->end() ->end() ->end() ->end(); return $treeBuilder; } }
如果您想测试是否默认将 default_value
设置为 foobar
,但又不想测试受 required_value
节点的要求影响,可以将它的路径定义为 array_node.*.default_value
,例如
/** * @test */ public function processed_configuration_for_array_node_1() { $this->assertProcessedConfigurationEquals( array( array('array_node' => array('prototype_name' => null)), ), array( 'array_node' => array( 'prototype_name' => array( 'default_value' => 'foobar' ) ) ), // the path of the nodes you want to focus on in this test: 'array_node.*.default_value' ); }
版本指导
版本 | 发布 | 状态 |
---|---|---|
3.x | 2017年11月30日 | 最新版 |
2.x | 2016年6月18日 | 已停售 |
1.x | 2014年10月12日 | 已停售 |