Skip to content

Commit d089d84

Browse files
authored
Merge pull request #431 from derrabus/improvement/dont-mock-container-builder
Run tests against a real ContainerBuilder
2 parents 01aacb3 + f5ba7c9 commit d089d84

File tree

4 files changed

+85
-213
lines changed

4 files changed

+85
-213
lines changed

tests/DependencyInjection/Compiler/AddExtensionsPassTest.php

+27-89
Original file line numberDiff line numberDiff line change
@@ -3,119 +3,57 @@
33
namespace Knp\Bundle\MenuBundle\Tests\DependencyInjection\Compiler;
44

55
use Knp\Bundle\MenuBundle\DependencyInjection\Compiler\AddExtensionsPass;
6-
use Knp\Menu\FactoryInterface;
7-
use Knp\Menu\ItemInterface;
6+
use Knp\Menu\MenuFactory;
87
use PHPUnit\Framework\TestCase;
98
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
9+
use Symfony\Component\DependencyInjection\ContainerBuilder;
1010
use Symfony\Component\DependencyInjection\Reference;
1111

1212
class AddExtensionsPassTest extends TestCase
1313
{
1414
public function testProcessWithoutProviderDefinition()
1515
{
16-
$containerBuilder = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->getMock();
17-
$containerBuilder->expects($this->once())
18-
->method('has')
19-
->willReturn(false);
20-
$containerBuilder->expects($this->never())
21-
->method('findTaggedServiceIds');
16+
$containerBuilder = new ContainerBuilder();
17+
(new AddExtensionsPass())->process($containerBuilder);
2218

23-
$menuPass = new AddExtensionsPass();
24-
25-
$menuPass->process($containerBuilder);
19+
self::assertFalse($containerBuilder->has('knp_menu.factory'));
2620
}
2721

2822
public function testProcessWithAlias()
2923
{
30-
$menuFactoryClass = 'Knp\Bundle\MenuBundle\Tests\DependencyInjection\Compiler\MenuFactoryMock';
24+
$containerBuilder = new ContainerBuilder();
25+
$containerBuilder->register('knp_menu.factory', MenuFactory::class);
3126

32-
$definitionMock = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')
33-
->disableOriginalConstructor()
34-
->getMock();
35-
$definitionMock->expects($this->at(0))
36-
->method('getClass')
37-
->willReturn($menuFactoryClass);
38-
$definitionMock->expects($this->at(1))
39-
->method('addMethodCall')
40-
->with($this->equalTo('addExtension'), $this->equalTo([new Reference('id'), 0]));
41-
$definitionMock->expects($this->at(2))
42-
->method('addMethodCall')
43-
->with($this->equalTo('addExtension'), $this->equalTo([new Reference('id'), 12]));
44-
$definitionMock->expects($this->at(3))
45-
->method('addMethodCall')
46-
->with($this->equalTo('addExtension'), $this->equalTo([new Reference('foo'), -4]));
27+
$containerBuilder->register('id', 'stdClass')
28+
->addTag('knp_menu.factory_extension')
29+
->addTag('knp_menu.factory_extension', ['priority' => 12]);
4730

48-
$parameterBagMock = $this->getMockBuilder('Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface')->getMock();
49-
$parameterBagMock->expects($this->once())
50-
->method('resolveValue')
51-
->with($menuFactoryClass)
52-
->willReturn($menuFactoryClass);
53-
54-
$containerBuilderMock = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->getMock();
55-
$containerBuilderMock->expects($this->once())
56-
->method('has')
57-
->willReturn(true);
58-
$containerBuilderMock->expects($this->once())
59-
->method('findTaggedServiceIds')
60-
->with($this->equalTo('knp_menu.factory_extension'))
61-
->willReturn(['id' => ['tag1' => [], 'tag2' => ['priority' => 12]], 'foo' => ['tag1' => ['priority' => -4]]]);
62-
$containerBuilderMock->expects($this->once())
63-
->method('findDefinition')
64-
->with($this->equalTo('knp_menu.factory'))
65-
->willReturn($definitionMock);
66-
$containerBuilderMock->expects($this->once())
67-
->method('getParameterBag')
68-
->willReturn($parameterBagMock);
31+
$containerBuilder->register('foo', 'stdClass')
32+
->addTag('knp_menu.factory_extension', ['priority' => -4]);
6933

7034
$menuPass = new AddExtensionsPass();
71-
$menuPass->process($containerBuilderMock);
35+
$menuPass->process($containerBuilder);
36+
37+
self::assertEquals(
38+
[
39+
['addExtension', [new Reference('id'), 0]],
40+
['addExtension', [new Reference('id'), 12]],
41+
['addExtension', [new Reference('foo'), -4]],
42+
],
43+
$containerBuilder->getDefinition('knp_menu.factory')->getMethodCalls()
44+
);
7245
}
7346

7447
public function testMissingAddExtension()
7548
{
76-
$definitionMock = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')
77-
->disableOriginalConstructor()
78-
->getMock();
79-
$definitionMock->expects($this->at(0))
80-
->method('getClass')
81-
->willReturn('SimpleMenuFactory');
82-
83-
$parameterBagMock = $this->getMockBuilder('Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface')->getMock();
84-
$parameterBagMock->expects($this->once())
85-
->method('resolveValue')
86-
->with('SimpleMenuFactory')
87-
->willReturn('SimpleMenuFactory');
49+
$containerBuilder = new ContainerBuilder();
8850

89-
$containerBuilderMock = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->getMock();
90-
$containerBuilderMock->expects($this->once())
91-
->method('has')
92-
->willReturn(true);
93-
$containerBuilderMock->expects($this->once())
94-
->method('findTaggedServiceIds')
95-
->with($this->equalTo('knp_menu.factory_extension'))
96-
->willReturn(['id' => ['tag1' => [], 'tag2' => ['priority' => 12]], 'foo' => ['tag1' => ['priority' => -4]]]);
97-
$containerBuilderMock->expects($this->once())
98-
->method('findDefinition')
99-
->with($this->equalTo('knp_menu.factory'))
100-
->willReturn($definitionMock);
101-
$containerBuilderMock->expects($this->once())
102-
->method('getParameterBag')
103-
->willReturn($parameterBagMock);
104-
105-
$this->expectException(InvalidConfigurationException::class);
51+
$containerBuilder->register('knp_menu.factory', 'SimpleMenuFactory');
52+
$containerBuilder->register('foo', 'stdClass')->addTag('knp_menu.factory_extension');
10653

10754
$menuPass = new AddExtensionsPass();
108-
$menuPass->process($containerBuilderMock);
109-
}
110-
}
11155

112-
class MenuFactoryMock implements FactoryInterface
113-
{
114-
public function createItem(string $name, array $options = []): ItemInterface
115-
{
116-
}
117-
118-
public function addExtension()
119-
{
56+
$this->expectException(InvalidConfigurationException::class);
57+
$menuPass->process($containerBuilder);
12058
}
12159
}

tests/DependencyInjection/Compiler/AddProvidersPassTest.php

+23-54
Original file line numberDiff line numberDiff line change
@@ -3,45 +3,32 @@
33
namespace Knp\Bundle\MenuBundle\Tests\DependencyInjection\Compiler;
44

55
use Knp\Bundle\MenuBundle\DependencyInjection\Compiler\AddProvidersPass;
6+
use Knp\Menu\Provider\ChainProvider;
67
use PHPUnit\Framework\TestCase;
78
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
9+
use Symfony\Component\DependencyInjection\ContainerBuilder;
810
use Symfony\Component\DependencyInjection\Reference;
911

1012
class AddProvidersPassTest extends TestCase
1113
{
1214
public function testProcessWithoutProviderDefinition()
1315
{
14-
$containerBuilder = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->getMock();
15-
$containerBuilder->expects($this->once())
16-
->method('hasDefinition')
17-
->willReturn(false);
18-
$containerBuilder->expects($this->never())
19-
->method('findTaggedServiceIds');
16+
$containerBuilder = new ContainerBuilder();
17+
(new AddProvidersPass())->process($containerBuilder);
2018

21-
$providersPass = new AddProvidersPass();
22-
23-
$providersPass->process($containerBuilder);
19+
self::assertFalse($containerBuilder->hasAlias('knp_menu.menu_provider'));
2420
}
2521

2622
public function testProcessForOneProvider()
2723
{
28-
$containerBuilderMock = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->getMock();
29-
$containerBuilderMock->expects($this->once())
30-
->method('hasDefinition')
31-
->willReturn(true);
32-
$containerBuilderMock->expects($this->once())
33-
->method('findTaggedServiceIds')
34-
->with($this->equalTo('knp_menu.provider'))
35-
->willReturn(['id' => ['provider_tag1']]);
36-
$containerBuilderMock->expects($this->once())
37-
->method('setAlias')
38-
->with(
39-
$this->equalTo('knp_menu.menu_provider'),
40-
$this->equalTo('id')
41-
);
24+
$containerBuilder = new ContainerBuilder();
25+
$containerBuilder->register('knp_menu.menu_provider.chain', ChainProvider::class);
26+
$containerBuilder->register('id')->addTag('knp_menu.provider');
27+
28+
(new AddProvidersPass())->process($containerBuilder);
4229

43-
$providersPass = new AddProvidersPass();
44-
$providersPass->process($containerBuilderMock);
30+
self::assertTrue($containerBuilder->hasAlias('knp_menu.menu_provider'));
31+
self::assertSame('id', (string) $containerBuilder->getAlias('knp_menu.menu_provider'));
4532
}
4633

4734
public function testProcessForManyProviders()
@@ -52,36 +39,18 @@ public function testProcessForManyProviders()
5239
$expectedProviders = new IteratorArgument($expectedProviders);
5340
}
5441

55-
$definitionMock = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')
56-
->disableOriginalConstructor()
57-
->getMock();
58-
$definitionMock->expects($this->once())
59-
->method('replaceArgument')
60-
->with($this->equalTo(0), $expectedProviders);
42+
$containerBuilder = new ContainerBuilder();
43+
$containerBuilder->register('knp_menu.menu_provider.chain', ChainProvider::class)->setArgument(0, []);
44+
$containerBuilder->register('id')->addTag('knp_menu.provider');
45+
$containerBuilder->register('id2')->addTag('knp_menu.provider');
46+
47+
(new AddProvidersPass())->process($containerBuilder);
6148

62-
$containerBuilderMock = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->getMock();
63-
$containerBuilderMock->expects($this->once())
64-
->method('hasDefinition')
65-
->willReturn(true);
66-
$containerBuilderMock->expects($this->once())
67-
->method('findTaggedServiceIds')
68-
->with($this->equalTo('knp_menu.provider'))
69-
->willReturn([
70-
'id' => ['provider_tag1'],
71-
'id2' => ['provider_tag2'],
72-
]);
73-
$containerBuilderMock->expects($this->once())
74-
->method('setAlias')
75-
->with(
76-
$this->equalTo('knp_menu.menu_provider'),
77-
$this->equalTo('knp_menu.menu_provider.chain')
78-
);
79-
$containerBuilderMock->expects($this->once())
80-
->method('getDefinition')
81-
->with($this->equalTo('knp_menu.menu_provider.chain'))
82-
->willReturn($definitionMock);
49+
self::assertTrue($containerBuilder->hasAlias('knp_menu.menu_provider'));
50+
self::assertSame('knp_menu.menu_provider.chain', (string) $containerBuilder->getAlias('knp_menu.menu_provider'));
8351

84-
$providersPass = new AddProvidersPass();
85-
$providersPass->process($containerBuilderMock);
52+
self::assertEquals(
53+
[$expectedProviders],
54+
$containerBuilder->getDefinition('knp_menu.menu_provider.chain')->getArguments());
8655
}
8756
}

tests/DependencyInjection/Compiler/AddRenderersPassTest.php

+10-19
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,23 @@ class AddRenderersPassTest extends TestCase
1414
{
1515
public function testProcessWithoutProviderDefinition()
1616
{
17-
$containerBuilder = $this->getMockBuilder(ContainerBuilder::class)->getMock();
18-
$containerBuilder->expects($this->once())
19-
->method('hasDefinition')
20-
->willReturn(false);
21-
$containerBuilder->expects($this->never())
22-
->method('findTaggedServiceIds');
23-
24-
$renderersPass = new AddRenderersPass();
17+
$containerBuilder = new ContainerBuilder();
18+
(new AddRenderersPass())->process($containerBuilder);
2519

26-
$renderersPass->process($containerBuilder);
20+
self::assertFalse($containerBuilder->has('knp_menu.renderer_provider'));
2721
}
2822

2923
public function testProcessWithEmptyAlias()
3024
{
31-
$containerBuilderMock = $this->getMockBuilder(ContainerBuilder::class)->getMock();
32-
$containerBuilderMock->expects($this->once())
33-
->method('hasDefinition')
34-
->willReturn(true);
35-
$containerBuilderMock->expects($this->once())
36-
->method('findTaggedServiceIds')
37-
->with($this->equalTo('knp_menu.renderer'))
38-
->willReturn(['id' => ['tag1' => ['alias' => '']]]);
25+
$containerBuilder = new ContainerBuilder();
26+
$containerBuilder->register('knp_menu.renderer_provider', PsrProvider::class);
27+
$containerBuilder->register('id')
28+
->addTag('knp_menu.renderer', ['alias' => '']);
3929

40-
$this->expectException(\InvalidArgumentException::class);
4130
$renderersPass = new AddRenderersPass();
42-
$renderersPass->process($containerBuilderMock);
31+
32+
$this->expectException(\InvalidArgumentException::class);
33+
$renderersPass->process($containerBuilder);
4334
}
4435

4536
public function testProcessWithAlias()

0 commit comments

Comments
 (0)