Symfony2: how to test values ​​of configuration nodes and index

In Symfony2, using this class setting, how can I verify that each node is defined in the Configuration class, and that their values ​​are correctly configured.

Class to check

  # My \ Bundle \ DependencyInjection \ Configuration.php

 class Configuration implements ConfigurationInterface
 {
     / **
      * {@inheritDoc}
      * /
     public function getConfigTreeBuilder ()
     {
         $ treeBuilder = new TreeBuilder ();
         $ treeBuilder-> root ('my_bundle')
             -> children ()
                 -> scalarNode ("scalar") -> defaultValue ("defaultValue") -> end ()
                 -> arrayNode ("arrayNode")
                     -> children ()
                         -> scalarNode ("val1") -> defaultValue ("defaultValue1") -> end ()
                         -> scalarNode ("val2") -> defaultValue ("defaultValue2") -> end ()
                     -> end ()
                 -> end ()
             -> end ()
         ;

         return $ treeBuilder;
     }
 }

Here are the statements I would like to make in my unit test:

I tried to access the nodes as an array, but it does not seem to work. In addition, TreeBuilder does not seem to give us the ability to receive configurations as an array if they are not loaded by the package extension.

Test

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

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

 $ this-> assertInstanceOf ("Symfony \ Component \ Config \ Definition \ Builder \ TreeBuilder", $ treeBuilder);

 // How to access the treebuilder nodes?
 $ rootNode = $ treeBuilder ["my_bundle"];
 $ scalarNode = $ treeBuilder ["scalar"];
 $ arrayNode = $ treeBuilder ["arrayNode"];
 $ val1Node = $ arrayNode ["val1"];
 $ val2Node = $ arrayNode ["val2"];

 $ this-> assertInstanceOf ("Symfony \ ... \ ArrayNodeDefinition", $ rootNode);
 $ this-> assertEquals ("defaultValue", $ scalarNode, "Test the default value of the node");
 $ this-> assertEquals ("defaultValue", $ val1Node, "Test the default value of the node");
 $ this-> assertEquals ("defaultValue", $ val2Node, "Test the default value of the node");
+6
source share
2 answers

I found a solution that could work based on JMSSecurityBundle .

Instead of checking the configuration, I am testing an extension, which, by the way, will add coverage for the configuration. That way, I can claim that the default setting has been set.

For example, this is 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'); } } 

There may be tests such as:

 #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; } } 
+9
source

To verify the configuration in isolation , you can do this:

 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'] ], // ... ]; } } 
+1
source

All Articles