[HttpKernel] better written kernel tests

This commit is contained in:
Tobias Schultze 2013-11-11 19:41:19 +01:00
parent 111ac18232
commit 2a9daff8d9
2 changed files with 102 additions and 182 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}