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.
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.
评论
发表评论