Aaron Scherer's Blog

Symfony2 Testing: Testing Services in Request Scope

Introduction

user

Aaron Scherer


Symfony2, php, Testing, PHP, programming

Symfony2 Testing: Testing Services in Request Scope

Posted by Aaron Scherer on .
Featured

Symfony2, php, Testing, PHP, programming

Symfony2 Testing: Testing Services in Request Scope

Posted by Aaron Scherer on .

Getting into testing at work with one of our new projects, and we need to be able to test our services. The biggest problem I had here, is that we have several services not in the default scope. After a little bit of digging and testing, I came up with this:

<?php  
/**
 * @author    Aaron Scherer <[email protected]>
 * @date      2013
 * @copyright Underground Elephant
 */
namespace Ue\Bundle\RenderBundle\Tests\Service;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;  
use Symfony\Component\HttpKernel\HttpKernelInterface;  
use Symfony\Component\HttpFoundation\Request;

use Ue\Bundle\RenderBundle\Service\RequestService;

/**
 * RequestServiceTest Class
 */
class RequestServiceTest extends WebTestCase  
{

    /**
     * @var RequestService
     */
    private $requestService;

    /**
     * @var
     */
    private $container;

    /**
     * {@inheritDoc}
     */
    public function setUp()
    {
        $container = $this->getContainer();
        $container->enterScope( 'request' );
        $request = Request::create( '/t/1/' );
        $session = $this->getMock( 'Symfony\Component\HttpFoundation\Session\SessionInterface' );
        $request->setSession( $session );
        $this->getContainer()->set( 'request', $request );

        $this->requestService = $this->container->get( 'ue.render.request' );
    }

    /**
     * {@inheritDoc}
     */
    public function tearDown()
    {
        $this->getContainer()->leaveScope('request');
    }

    /**
     * @return mixed
     */
    public function getContainer()
    {
        if ( $this->container ) {
            return $this->container;
        }

        static::$kernel = static::createKernel( );
        static::$kernel->boot();

        $this->container = static::$kernel->getContainer();

        return $this->container;
    }

    /**
     * Testing the constructor, and service call
     */
    public function testRequestService()
    {

        $expected = 'Ue\Bundle\RenderBundle\Service\RequestService';
        $this->assertInstanceOf(
            $expected,
            $this->requestService,
            sprintf( "Expected %s for requestService. Got %s.", $expected, get_class( $this->requestService ) )
        );
    }

    /**
     * @depends testRequestService
     */
    public function testBuildRequest()
    {
        $this->requestService->setTestId( 1 );

        $expected = 'Ue\Bundle\RenderBundle\Model\Request';
        $request  = $this->requestService->buildRequest();
        $this->assertInstanceOf(
            $expected,
            $request,
            sprintf( "Expected %s for response from buildRequest(). Got %s instead.", $expected, get_class( $request ) )
        );
    }
}
?>

This creates the request (which you need to get the service), sets up the kernel, and because our RequestService is in the request scope, enters the request scope with $container->enterScope( 'request' );.

user

Aaron Scherer

http://aaronscherer.me