hostnet/symfony-config-test

该包已被废弃,不再维护。没有建议的替代包。

测试与Symfony配置组件相关的用户类库

v3.2.0 2018-02-08 14:45 UTC

README

重要:该包不再维护,请考虑使用原始源代码:[https://github.com/SymfonyTest/SymfonyConfigTest](https://github.com/SymfonyTest/SymfonyConfigTest)。

SymfonyConfigTest

作者:Matthias Noback

Build Status

使用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_1array_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日 已停售