a

Câu hỏi Symfony2: Cách kiểm tra các giá trị và chỉ số của nút Configuration


Trong Symfony2, sử dụng thiết lập lớp này, làm cách nào tôi có thể kiểm tra xem mỗi nút được định nghĩa trong Configuration và các giá trị của chúng được cấu hình đúng.

Lớp học để kiểm tra

# My \ Bundle \ DependencyInjection \ Configuration.php

Cấu hình lớp thực hiện ConfigurationInterface
{
    / **
     * {@inheritDoc}
     * /
    chức năng công khai getConfigTreeBuilder ()
    {
        $ treeBuilder = new TreeBuilder ();
        $ treeBuilder-> root ('my_bundle')
            -> trẻ em ()
                -> scalarNode ("vô hướng") -> defaultValue ("defaultValue") -> end ()
                -> arrayNode ("mảngNode")
                    -> trẻ em ()
                        -> scalarNode ("val1") -> defaultValue ("defaultValue1") -> end ()
                        -> scalarNode ("val2") -> defaultValue ("defaultValue2") -> end ()
                    -> kết thúc ()
                -> kết thúc ()
            -> kết thúc ()
        ;

        return $ treeBuilder;
    }
}

Dưới đây là các xác nhận tôi muốn làm, trong bài kiểm tra đơn vị của tôi:

Tôi đã cố gắng truy cập các nút như một mảng, nhưng nó dường như không hoạt động. Cũng là TreeBuilder dường như không cung cấp cho chúng tôi khả năng nhận cấu hình dưới dạng mảng, trừ khi chúng được tải bởi tiện ích mở rộng của gói.

Kiểm tra

# My \ Bundle \ Tests \ DependencyInjection \ ConfigurationTest.php

$ configuration = $ this-> getConfiguration ();
$ treeBuilder = $ configuration-> getConfigTreeBuilder ();

$ this-> assertInstanceOf ("Symfony \ Component \ Config \ Định nghĩa \ Builder \ TreeBuilder", $ treeBuilder);

// Cách truy cập các nút của treebuilder?
$ rootNode = $ treeBuilder ["my_bundle"];
$ scalarNode = $ treeBuilder ["vô hướng"];
$ arrayNode = $ treeBuilder ["arrayNode"];
$ val1Node = $ arrayNode ["val1"];
$ val2Node = $ arrayNode ["val2"];

$ this-> assertInstanceOf ("Symfony \ ... \ ArrayNodeDefinition", $ rootNode);
$ this-> assertEquals ("defaultValue", $ scalarNode, "Kiểm tra giá trị mặc định của nút");
$ this-> assertEquals ("defaultValue", $ val1Node, "Kiểm tra giá trị mặc định của nút");
$ this-> assertEquals ("defaultValue", $ val2Node, "Kiểm tra giá trị mặc định của nút");

8
2017-12-21 13:30


gốc


Tôi không nghĩ rằng nó thực sự là ý tưởng tốt để kiểm tra cấu hình và cũng thử nghiệm nó theo cách đó. - Ziumin
@Ziumin, Bạn sẽ đề xuất phương pháp nào để đảm bảo rằng giá trị có giá trị mặc định được đặt hoặc id dịch vụ mặc định sẽ được xác nhận ... - yvoyer
Tôi đề nghị chuẩn bị một bộ kiểm tra các congigurations và kiểm tra xem chúng có được xử lý đúng với lớp cấu hình của bạn không - Ziumin
@ Ziumin, Câu trả lời của tôi có đúng không? Bởi vì, vấn đề duy nhất tôi thấy với nó, đó là bài kiểm tra được suy luận trên một thành phần khác thay vì chỉ kiểm tra Configurationlớp học. - yvoyer


Các câu trả lời:


Tôi đã tìm ra một giải pháp có thể hoạt động dựa trên JMSSecurityBundle.

Thay vì kiểm tra cấu hình, tôi thử nghiệm phần mở rộng sẽ thêm độ bao phủ cho cấu hình bằng cách này. Bằng cách đó, tôi có thể khẳng định rằng một cấu hình mặc định đã được thiết lập.

Ví dụ, điều này Extension.

#My\Bundle\DependencyInjection\MyBundleExtension
class MyBundleExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config        = $this->processConfiguration($configuration, $configs);

        $container->setParameter("crak_landing_frontend.scalar", $config["scalar"]);
        $container->setParameter("crak_landing_frontend.array_node", $config["array_node"]);

        $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.xml');
    }
}

Có thể là các thử nghiệm như:

#My\Bundle\Tests\DependencyInjection\MyBundleExtensionTest
class MyBundleExtensionTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var MyBundleExtension
     */
    private $extension;

    /**
     * Root name of the configuration
     *
     * @var string
     */
    private $root;

    public function setUp()
    {
        parent::setUp();

        $this->extension = $this->getExtension();
        $this->root      = "my_bundle";
    }

    public function testGetConfigWithDefaultValues()
    {
        $this->extension->load(array(), $container = $this->getContainer());

        $this->assertTrue($container->hasParameter($this->root . ".scalar"));
        $this->assertEquals("defaultValue", $container->getParameter($this->root . ".scalar"));

        $expected = array(
            "val1" => "defaultValue1",
            "val2" => "defaultValue2",
        );
        $this->assertTrue($container->hasParameter($this->root . ".array_node"));
        $this->assertEquals($expected, $container->getParameter($this->root . ".array_node"));
    }

    public function testGetConfigWithOverrideValues()
    {
        $configs = array(
            "scalar"     => "scalarValue",
            "array_node" => array(
                "val1" => "array_value_1",
                "val2" => "array_value_2",
            ),
        );

        $this->extension->load(array($configs), $container = $this->getContainer());

        $this->assertTrue($container->hasParameter($this->root . ".scalar"));
        $this->assertEquals("scalarValue", $container->getParameter($this->root . ".scalar"));

        $expected = array(
            "val1" => "array_value_1",
            "val2" => "array_value_2",
        );
        $this->assertTrue($container->hasParameter($this->root . ".array_node"));
        $this->assertEquals($expected, $container->getParameter($this->root . ".array_node"));
    }

    /**
     * @return MyBundleExtension
     */
    protected function getExtension()
    {
        return new MyBundleExtension();
    }

    /**
     * @return ContainerBuilder
     */
    private function getContainer()
    {
        $container = new ContainerBuilder();

        return $container;
    }
}

10
2017-12-21 15:36



Vâng, đó là cách tốt hơn để kiểm tra nó. - Ziumin
Cảm ơn phản hồi của bạn - yvoyer


Để kiểm tra cấu hình của bạn bị cô lập, bạn có thể làm được việc này :

use Foo\YourBundle\DependencyInjection\Configuration;
use PHPUnit\Framework\TestCase;

class ConfigurationTest extends TestCase
{
    /**
     * @dataProvider dataTestConfiguration
     *
     * @param mixed $inputConfig
     * @param mixed $expectedConfig
     */
    public function testConfiguration($inputConfig, $expectedConfig)
    {
        $configuration = new Configuration();

        $node = $configuration->getConfigTreeBuilder()
            ->buildTree();
        $normalizedConfig = $node->normalize($inputConfig);
        $finalizedConfig = $node->finalize($normalizedConfig);

        $this->assertEquals($expectedConfig, $finalizedConfig);
    }

    public function dataTestConfiguration()
    {
        return [
            'test configuration'   => [
                ['input'],
                ['expected_config']
            ],
            // ...
        ];
    }
}

3
2017-07-22 15:56



Cảm ơn ví dụ tuyệt vời này - Julien Bourdeau