跳至主要内容

symfony2 unit test

how tu simulate a request without call a controller? This article give a solution even his basic idea is to fast the controller unit test. For example, if we need to test a service which is called by a controller. In the service we have some parmeters from the request, or have a request as parameter, so we need to generate the container before test this service. But the normal way of symfony2 unit test you need to generate a client and then send them to controller, so we need to find a way directly inject our container to the service.

http://leftnode.com/entry/faster-symfony2-tests.html  see this.


namespace Acme\DemoBundle\Tests\Unit\Controller;

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

class ControllerTest extends WebTestCase
{

    public function testControllerAction()
    {
        $client = static::createClient();
        $container = $client->getKernel()
            ->getContainer();

        $request = new Request;
        $request->headers->set('Accept', 'application/json');
        $request->server->set('REMOTE_ADDR', '127.0.0.1');

        $container->set('request', $request);

        $controller = new \Acme\DemoBundle\Controller\PageController;
        $controller->setContainer($this->container);

        $response = $controller->readAction();

        $this->assertEquals(200, $response->getStatusCode());
        $this->assertRegExp('/foo/i', $response->getContent());
    }

}
or you can just wirte a base unittest case:

namespace Acme\DemoBundle\Tests\Unit\Controller;

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

class BaseControllerTestCase extends WebTestCase
{

    protected $client = null;
    protected $container = null;

    public function setUp()
    {
        $this->client = static::createClient();

        $this->container = $this->client
            ->getKernel()
            ->getContainer();
    }

    /**
     * Builds a Controller object and the request to satisfy it. Attaches the request
     * to the object and to the container.
     *
     * @param string The full path to the Controller class.
     * @param array An array of parameters to pass into the request.
     * @return Controller The built Controller object.
     */
    protected function createController($controllerClass,
        array $parameters=array(), array $query=array())
    {
        $request = $this->createWebRequest();
        $request->request->add($parameters);
        $request->query->add($query);

        $this->container
            ->set('request', $request);

        $controller = new $controllerClass;
        $controller->setContainer($this->container);

        return($controller);
    }

    /**
     * Creates a new Request object and hydrates it with the proper values to make
     * a valid web request.
     *
     * @return Request The hydrated Request object.
     */
    protected function createWebRequest()
    {
        $request = new Request;
        $request->headers->set('Accept', 'application/json');
        $request->server->set('REMOTE_ADDR', '127.0.0.1');

        return($request);
    }

}
and then use it like this:
namespace Acme\DemoBundle\Tests\Unit\Controller;

use Acme\DemoBundle\Tests\Unit\Controller\BaseControllerTestCase;

class PageControllerTest extends BaseControllerTestCase
{

    public function testReadAction()
    {
        $controllerName = 'Acme\DemoBundle\Controller\PageController';
        $controller = $this->createController($controllerName);

        $response = $controller->readAction();

        $this->assertEquals(200, $response->getStatusCode());
        $this->assertRegExp('/foo/i', $response->getContent());
    }

}
but with this we can not use symfony2 profiler.

评论

此博客中的热门博文

My childhood

"Each person's life is like a book; some people prefer to savor it slowly, while others like to gradually forget it. Looking back, I want to see if I can discern the trajectory of the world from my seemingly insignificant life. I am a child from the countryside, and perhaps most people cannot understand what my so-called countryside looks like. Indeed, the impressions of the countryside can be very different depending on the country, and moreover, more than 40 years have passed, during these 40 years of rapid development in China. A phrase suddenly comes to mind, 'I see him building tall buildings, I see him feasting, I see everything collapsing.' The place where I was born is a small town in the southwest of China, a town so small that it only has one street, and the widest part is only 3 meters. Paved with stone slabs, worn by many years of use, the slabs are not flat but rather filled with small bumps and hollows, yet strangely smooth. At the end of the street is a ...

youtube script covid

[INTRO - Soft Music Playing] Narrator: "In August 2020, during the COVID-19 pandemic in China, I experienced a series of events that revealed the overbearing, unreasonable, and ignorant aspects of government policies. This story unfolds my observations and experiences in Xinjiang since April, presented in a neutral and factual manner." [Scene Transition - Music Shifts to a More Reflective Tone] Narrator: "April 8th marked the end of my nearly three-month-long home quarantine in Wuhan, as the lockdown was finally lifted. With Xinjiang gradually reopening since March, my work required me to return there as soon as possible." [Visuals: Scenes of Empty Streets in Wuhan, Transitioning to Busy Airports] Narrator: "My journey back to Xinjiang was fraught with delays. The direct flight on China Southern Airlines kept getting postponed. Reluctantly, I had to transit through Xi'an. Before leaving, I reported my health status to the community in Changji City, where I ...

survilliance in china

  Hello everyone, welcome to my YouTube channel. This is my first video, and I'm very happy to meet you all. I come from China, and looking back, time has passed so quickly. I've been in France for almost 20 years. Sometimes, when I chat with friends, I'm surprised at how little the French know about China. What's even more alarming is that the French media follows the narrative of the Chinese official media. This is why I decided to create a YouTube channel to talk to my French friends about the China I know. Since my parents and friends are still in China, and to avoid unnecessary impact on their lives, I've decided not to appear in person for now. This is how I fulfill my long-standing wish. My first episode is about "Digital Surveillance in China.",  Digital Surveillance: In China, using the official App Store is mandatory. Apple's App Store is China-specific, and all data is stored there. Google's App Store is simply inaccessible in China. If ...