From 2a9daff8d947ac80aeda59c74011ca67a7d56eed Mon Sep 17 00:00:00 2001 From: Tobias Schultze Date: Mon, 11 Nov 2013 19:41:19 +0100 Subject: [PATCH] [HttpKernel] better written kernel tests --- .../Tests/Fixtures/KernelForTest.php | 19 +- .../Component/HttpKernel/Tests/KernelTest.php | 265 +++++++----------- 2 files changed, 102 insertions(+), 182 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php index e24daef2b3..5fd61bbc7e 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php @@ -23,32 +23,15 @@ class KernelForTest extends Kernel public function registerBundles() { - } - - public function init() - { - } - - public function registerBundleDirs() - { + return array(); } public function registerContainerConfiguration(LoaderInterface $loader) { } - public function initializeBundles() - { - parent::initializeBundles(); - } - public function isBooted() { return $this->booted; } - - public function setIsBooted($value) - { - $this->booted = (Boolean) $value; - } } diff --git a/src/Symfony/Component/HttpKernel/Tests/KernelTest.php b/src/Symfony/Component/HttpKernel/Tests/KernelTest.php index a3526913f9..fb84b6a1f9 100644 --- a/src/Symfony/Component/HttpKernel/Tests/KernelTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/KernelTest.php @@ -12,7 +12,6 @@ namespace Symfony\Component\HttpKernel\Tests; use Symfony\Component\HttpKernel\Kernel; -use Symfony\Component\HttpKernel\Bundle\Bundle; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -52,33 +51,22 @@ class KernelTest extends \PHPUnit_Framework_TestCase public function testBootInitializesBundlesAndContainer() { - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('initializeBundles', 'initializeContainer', 'getBundles')) - ->getMock(); + $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer')); $kernel->expects($this->once()) ->method('initializeBundles'); $kernel->expects($this->once()) ->method('initializeContainer'); - $kernel->expects($this->once()) - ->method('getBundles') - ->will($this->returnValue(array())); $kernel->boot(); } public function testBootSetsTheContainerToTheBundles() { - $bundle = $this->getMockBuilder('Symfony\Component\HttpKernel\Bundle\Bundle') - ->disableOriginalConstructor() - ->getMock(); + $bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle'); $bundle->expects($this->once()) ->method('setContainer'); - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('initializeBundles', 'initializeContainer', 'getBundles')) - ->getMock(); + $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer', 'getBundles')); $kernel->expects($this->once()) ->method('getBundles') ->will($this->returnValue(array($bundle))); @@ -88,13 +76,11 @@ class KernelTest extends \PHPUnit_Framework_TestCase public function testBootSetsTheBootedFlagToTrue() { + // use test kernel to access isBooted() $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('initializeBundles', 'initializeContainer', 'getBundles')) + ->setConstructorArgs(array('test', false)) + ->setMethods(array('initializeBundles', 'initializeContainer')) ->getMock(); - $kernel->expects($this->once()) - ->method('getBundles') - ->will($this->returnValue(array())); $kernel->boot(); @@ -103,14 +89,8 @@ class KernelTest extends \PHPUnit_Framework_TestCase public function testClassCacheIsLoaded() { - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('initializeBundles', 'initializeContainer', 'getBundles', 'doLoadClassCache')) - ->getMock(); + $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer', 'doLoadClassCache')); $kernel->loadClassCache('name', '.extension'); - $kernel->expects($this->any()) - ->method('getBundles') - ->will($this->returnValue(array())); $kernel->expects($this->once()) ->method('doLoadClassCache') ->with('name', '.extension'); @@ -120,13 +100,7 @@ class KernelTest extends \PHPUnit_Framework_TestCase public function testClassCacheIsNotLoadedByDefault() { - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('initializeBundles', 'initializeContainer', 'getBundles', 'doLoadClassCache')) - ->getMock(); - $kernel->expects($this->any()) - ->method('getBundles') - ->will($this->returnValue(array())); + $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer')); $kernel->expects($this->never()) ->method('doLoadClassCache'); @@ -135,27 +109,17 @@ class KernelTest extends \PHPUnit_Framework_TestCase public function testClassCacheIsNotLoadedWhenKernelIsNotBooted() { - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('initializeBundles', 'initializeContainer', 'getBundles', 'doLoadClassCache')) - ->getMock(); + $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer', 'doLoadClassCache')); $kernel->loadClassCache(); - $kernel->expects($this->any()) - ->method('getBundles') - ->will($this->returnValue(array())); $kernel->expects($this->never()) ->method('doLoadClassCache'); } public function testBootKernelSeveralTimesOnlyInitializesBundlesOnce() { - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('initializeBundles', 'initializeContainer', 'getBundles')) - ->getMock(); + $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer')); $kernel->expects($this->once()) - ->method('getBundles') - ->will($this->returnValue(array())); + ->method('initializeBundles'); $kernel->boot(); $kernel->boot(); @@ -163,40 +127,29 @@ class KernelTest extends \PHPUnit_Framework_TestCase public function testShutdownCallsShutdownOnAllBundles() { - $bundle = $this->getMockBuilder('Symfony\Component\HttpKernel\Bundle\Bundle') - ->disableOriginalConstructor() - ->getMock(); + $bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle'); $bundle->expects($this->once()) ->method('shutdown'); - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('getBundles')) - ->getMock(); - $kernel->expects($this->once()) - ->method('getBundles') - ->will($this->returnValue(array($bundle))); + $kernel = $this->getKernel(array(), array($bundle)); + $kernel->boot(); $kernel->shutdown(); } public function testShutdownGivesNullContainerToAllBundles() { - $bundle = $this->getMockBuilder('Symfony\Component\HttpKernel\Bundle\Bundle') - ->disableOriginalConstructor() - ->getMock(); - $bundle->expects($this->once()) + $bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle'); + $bundle->expects($this->at(3)) ->method('setContainer') ->with(null); - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('getBundles')) - ->getMock(); - $kernel->expects($this->once()) + $kernel = $this->getKernel(array('getBundles')); + $kernel->expects($this->any()) ->method('getBundles') ->will($this->returnValue(array($bundle))); + $kernel->boot(); $kernel->shutdown(); } @@ -214,11 +167,7 @@ class KernelTest extends \PHPUnit_Framework_TestCase ->method('handle') ->with($request, $type, $catch); - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('getHttpKernel')) - ->getMock(); - + $kernel = $this->getKernel(array('getHttpKernel')); $kernel->expects($this->once()) ->method('getHttpKernel') ->will($this->returnValue($httpKernelMock)); @@ -236,11 +185,7 @@ class KernelTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('getHttpKernel', 'boot')) - ->getMock(); - + $kernel = $this->getKernel(array('getHttpKernel', 'boot')); $kernel->expects($this->once()) ->method('getHttpKernel') ->will($this->returnValue($httpKernelMock)); @@ -248,10 +193,6 @@ class KernelTest extends \PHPUnit_Framework_TestCase $kernel->expects($this->once()) ->method('boot'); - // required as this value is initialized - // in the kernel constructor, which we don't call - $kernel->setIsBooted(false); - $kernel->handle($request, $type, $catch); } @@ -362,10 +303,7 @@ EOF; { $bundle = new FooBarBundle(); - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('getBundles')) - ->getMock(); + $kernel = $this->getKernel(array('getBundles')); $kernel->expects($this->once()) ->method('getBundles') ->will($this->returnValue(array($bundle))); @@ -409,7 +347,7 @@ EOF; */ public function testLocateResourceThrowsExceptionWhenNameIsNotValid() { - $this->getKernelForInvalidLocateResource()->locateResource('Foo'); + $this->getKernel()->locateResource('Foo'); } /** @@ -417,7 +355,7 @@ EOF; */ public function testLocateResourceThrowsExceptionWhenNameIsUnsafe() { - $this->getKernelForInvalidLocateResource()->locateResource('@FooBundle/../bar'); + $this->getKernel()->locateResource('@FooBundle/../bar'); } /** @@ -425,7 +363,7 @@ EOF; */ public function testLocateResourceThrowsExceptionWhenBundleDoesNotExist() { - $this->getKernelForInvalidLocateResource()->locateResource('@FooBundle/config/routing.xml'); + $this->getKernel()->locateResource('@FooBundle/config/routing.xml'); } /** @@ -433,7 +371,7 @@ EOF; */ public function testLocateResourceThrowsExceptionWhenResourceDoesNotExist() { - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->once()) ->method('getBundle') @@ -445,7 +383,7 @@ EOF; public function testLocateResourceReturnsTheFirstThatMatches() { - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->once()) ->method('getBundle') @@ -460,7 +398,7 @@ EOF; $parent = $this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle'); $child = $this->getBundle(__DIR__.'/Fixtures/Bundle2Bundle'); - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->exactly(2)) ->method('getBundle') @@ -476,7 +414,7 @@ EOF; $parent = $this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle'); $child = $this->getBundle(__DIR__.'/Fixtures/Bundle2Bundle'); - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->once()) ->method('getBundle') @@ -491,7 +429,7 @@ EOF; public function testLocateResourceReturnsAllMatchesBis() { - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->once()) ->method('getBundle') @@ -509,7 +447,7 @@ EOF; public function testLocateResourceIgnoresDirOnNonResource() { - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->once()) ->method('getBundle') @@ -524,7 +462,7 @@ EOF; public function testLocateResourceReturnsTheDirOneForResources() { - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->once()) ->method('getBundle') @@ -539,7 +477,7 @@ EOF; public function testLocateResourceReturnsTheDirOneForResourcesAndBundleOnes() { - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->once()) ->method('getBundle') @@ -558,7 +496,7 @@ EOF; $parent = $this->getBundle(__DIR__.'/Fixtures/BaseBundle', null, 'BaseBundle', 'BaseBundle'); $child = $this->getBundle(__DIR__.'/Fixtures/ChildBundle', 'ParentBundle', 'ChildBundle', 'ChildBundle'); - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->exactly(4)) ->method('getBundle') @@ -593,7 +531,7 @@ EOF; public function testLocateResourceOnDirectories() { - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->exactly(2)) ->method('getBundle') @@ -609,7 +547,7 @@ EOF; $kernel->locateResource('@FooBundle/Resources', __DIR__.'/Fixtures/Resources') ); - $kernel = $this->getKernel(); + $kernel = $this->getKernel(array('getBundle')); $kernel ->expects($this->exactly(2)) ->method('getBundle') @@ -631,13 +569,19 @@ EOF; $parent = $this->getBundle(null, null, 'ParentABundle'); $child = $this->getBundle(null, 'ParentABundle', 'ChildABundle'); - $kernel = $this->getKernel(); + // use test kernel so we can access getBundleMap() + $kernel = $this + ->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') + ->setMethods(array('registerBundles')) + ->setConstructorArgs(array('test', false)) + ->getMock() + ; $kernel ->expects($this->once()) ->method('registerBundles') ->will($this->returnValue(array($parent, $child))) ; - $kernel->initializeBundles(); + $kernel->boot(); $map = $kernel->getBundleMap(); $this->assertEquals(array($child, $parent), $map['ParentABundle']); @@ -649,14 +593,20 @@ EOF; $parent = $this->getBundle(null, 'GrandParentBBundle', 'ParentBBundle'); $child = $this->getBundle(null, 'ParentBBundle', 'ChildBBundle'); - $kernel = $this->getKernel(); + // use test kernel so we can access getBundleMap() + $kernel = $this + ->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') + ->setMethods(array('registerBundles')) + ->setConstructorArgs(array('test', false)) + ->getMock() + ; $kernel ->expects($this->once()) ->method('registerBundles') ->will($this->returnValue(array($grandparent, $parent, $child))) ; - $kernel->initializeBundles(); + $kernel->boot(); $map = $kernel->getBundleMap(); $this->assertEquals(array($child, $parent, $grandparent), $map['GrandParentBBundle']); @@ -666,18 +616,13 @@ EOF; /** * @expectedException \LogicException + * @expectedExceptionMessage Bundle "ChildCBundle" extends bundle "FooBar", which is not registered. */ public function testInitializeBundlesThrowsExceptionWhenAParentDoesNotExists() { $child = $this->getBundle(null, 'FooBar', 'ChildCBundle'); - - $kernel = $this->getKernel(); - $kernel - ->expects($this->once()) - ->method('registerBundles') - ->will($this->returnValue(array($child))) - ; - $kernel->initializeBundles(); + $kernel = $this->getKernel(array(), array($child)); + $kernel->boot(); } public function testInitializeBundlesSupportsArbitraryBundleRegistrationOrder() @@ -686,14 +631,20 @@ EOF; $parent = $this->getBundle(null, 'GrandParentCBundle', 'ParentCBundle'); $child = $this->getBundle(null, 'ParentCBundle', 'ChildCBundle'); - $kernel = $this->getKernel(); + // use test kernel so we can access getBundleMap() + $kernel = $this + ->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') + ->setMethods(array('registerBundles')) + ->setConstructorArgs(array('test', false)) + ->getMock() + ; $kernel ->expects($this->once()) ->method('registerBundles') ->will($this->returnValue(array($parent, $grandparent, $child))) ; - $kernel->initializeBundles(); + $kernel->boot(); $map = $kernel->getBundleMap(); $this->assertEquals(array($child, $parent, $grandparent), $map['GrandParentCBundle']); @@ -703,6 +654,7 @@ EOF; /** * @expectedException \LogicException + * @expectedExceptionMessage Bundle "ParentCBundle" is directly extended by two bundles "ChildC2Bundle" and "ChildC1Bundle". */ public function testInitializeBundlesThrowsExceptionWhenABundleIsDirectlyExtendedByTwoBundles() { @@ -710,59 +662,41 @@ EOF; $child1 = $this->getBundle(null, 'ParentCBundle', 'ChildC1Bundle'); $child2 = $this->getBundle(null, 'ParentCBundle', 'ChildC2Bundle'); - $kernel = $this->getKernel(); - $kernel - ->expects($this->once()) - ->method('registerBundles') - ->will($this->returnValue(array($parent, $child1, $child2))) - ; - $kernel->initializeBundles(); + $kernel = $this->getKernel(array(), array($parent, $child1, $child2)); + $kernel->boot(); } /** * @expectedException \LogicException + * @expectedExceptionMessage Trying to register two bundles with the same name "DuplicateName" */ public function testInitializeBundleThrowsExceptionWhenRegisteringTwoBundlesWithTheSameName() { $fooBundle = $this->getBundle(null, null, 'FooBundle', 'DuplicateName'); $barBundle = $this->getBundle(null, null, 'BarBundle', 'DuplicateName'); - $kernel = $this->getKernel(); - $kernel - ->expects($this->once()) - ->method('registerBundles') - ->will($this->returnValue(array($fooBundle, $barBundle))) - ; - $kernel->initializeBundles(); + $kernel = $this->getKernel(array(), array($fooBundle, $barBundle)); + $kernel->boot(); } /** * @expectedException \LogicException + * @expectedExceptionMessage Bundle "CircularRefBundle" can not extend itself. */ public function testInitializeBundleThrowsExceptionWhenABundleExtendsItself() { $circularRef = $this->getBundle(null, 'CircularRefBundle', 'CircularRefBundle'); - $kernel = $this->getKernel(); - $kernel - ->expects($this->once()) - ->method('registerBundles') - ->will($this->returnValue(array($circularRef))) - ; - $kernel->initializeBundles(); + $kernel = $this->getKernel(array(), array($circularRef)); + $kernel->boot(); } public function testTerminateReturnsSilentlyIfKernelIsNotBooted() { - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('getHttpKernel')) - ->getMock(); - + $kernel = $this->getKernel(array('getHttpKernel')); $kernel->expects($this->never()) ->method('getHttpKernel'); - $kernel->setIsBooted(false); $kernel->terminate(Request::create('/'), new Response()); } @@ -777,16 +711,12 @@ EOF; ->expects($this->never()) ->method('terminate'); - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('getHttpKernel')) - ->getMock(); - + $kernel = $this->getKernel(array('getHttpKernel')); $kernel->expects($this->once()) ->method('getHttpKernel') ->will($this->returnValue($httpKernelMock)); - $kernel->setIsBooted(true); + $kernel->boot(); $kernel->terminate(Request::create('/'), new Response()); // implements TerminableInterface @@ -799,19 +729,20 @@ EOF; ->expects($this->once()) ->method('terminate'); - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->disableOriginalConstructor() - ->setMethods(array('getHttpKernel')) - ->getMock(); - + $kernel = $this->getKernel(array('getHttpKernel')); $kernel->expects($this->exactly(2)) ->method('getHttpKernel') ->will($this->returnValue($httpKernelMock)); - $kernel->setIsBooted(true); + $kernel->boot(); $kernel->terminate(Request::create('/'), new Response()); } + /** + * Returns a mock for the BundleInterface + * + * @return BundleInterface + */ protected function getBundle($dir = null, $parent = null, $className = null, $bundleName = null) { $bundle = $this @@ -847,22 +778,28 @@ EOF; return $bundle; } - protected function getKernel() + /** + * Returns a mock for the abstract kernel. + * + * @param array $methods Additional methods to mock (besides the abstract ones) + * @param array $bundles Bundles to register + * + * @return Kernel + */ + protected function getKernel(array $methods = array(), array $bundles = array()) { - return $this - ->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') - ->setMethods(array('getBundle', 'registerBundles')) - ->disableOriginalConstructor() - ->getMock() - ; - } - - protected function getKernelForInvalidLocateResource() - { - return $this + $kernel = $this ->getMockBuilder('Symfony\Component\HttpKernel\Kernel') - ->disableOriginalConstructor() + ->setMethods($methods) + ->setConstructorArgs(array('test', false)) ->getMockForAbstractClass() ; + + $kernel->expects($this->any()) + ->method('registerBundles') + ->will($this->returnValue($bundles)) + ; + + return $kernel; } }