Symfony2: Как проверить значения и индекс узлов конфигурации
В Symfony2, используя эту настройку класса, как я могу проверить, что каждый узел определен в классе Configuration
и что их значения правильно настроены.
Класс для тестирования
# 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; } }
Вот утверждения, которые я хотел бы сделать в своем модульном тесте:
Я пытался получить доступ к узлам в виде массива, но, похоже, это не работает. Кроме того, TreeBuilder
, похоже, не дает нам возможности получить конфигурации в виде массива, если только они не загружены пакетом расширение.
Тесты
# 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's 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");
2 answers
Я нашел решение, которое могло бы работать на основе jmssecuritybundle.
Вместо тестирования конфигурации я тестирую расширение, которое, кстати, добавит покрытие для конфигурации. Таким образом, я могу утверждать, что была установлена конфигурация по умолчанию.
Например, это 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');
}
}
Могут быть такие тесты, как:
#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;
}
}
Чтобы протестировать вашу конфигурацию изолированно , вы можете сделать следующее:
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']
],
// ...
];
}
}