Скачать Symfony
Скачать последнюю версию Symfony можно тут
Документация Symfony
Русская документация по Symfony тут (оригинальная документация на английском тут)
Сообщество Symfony
Symfony коммьюнити тусуется тут
Под катом вашему вниманию предлагается пара советов, упрощающих тестирование контроллеров в symfony2.
#1. Используйте Service container в ваших тестах. Прежде всего это поможет вам забыть о хардкоде URL, при смене итоговой локации маршруты не будут меняться (и кто знает, что еще может пригодиться):
<?php#2. Выполняйте аутентификацию пользователя без заполнения форм (навеяно советом Benjamin'а отсюда: https://gist.github.com/1223886 , однако же тот код сразу запустить не удалось, а ниже представлен рабочий вариант, который со вчерашнего дня тестирует этот блог):
namespace Your\SiteBundle\Tests\Controller; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class BlogPostControllerTest extends WebTestCase {
public function testCRUDScenario()
{
$client = $this->createClient();
$client->followRedirects(true);
$serviceContainer = self::$kernel->getContainer();
$router = $serviceContainer->get('router');
$crawler = $client->request('GET', $router->generate('some_route'));
$this->assertTrue(200 === $adminClient->getResponse()->getStatusCode()); // ....
Надеемся это вам поможет писать тесты лучше... и больше! )
<?php
namespace Your\SiteBundle\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Role\Role;
use JMS\SecurityExtraBundle\Security\Authentication\Token\RunAsUserToken;
abstract class AbstractAdminTestCase extends WebTestCase
{
/** * Benjamin declare this method as abstract and says that * it must return an instance of UserInterface but 'string' also works. * Note that roles in this case must be defined manually * as array ($user->getRoles() won't work)
*/
protected function getCurrentUser()
{
return 'user';
}
/**
* User with auth.
*
* @param $firewallName
* @param array $options
* @param array $server
*
* @return Symfony\Bundle\FrameworkBundle\Test\Client|Symfony\Component\BrowserKit\Client
*/
protected function createClientWithAuthentication($firewallName, array $options = array(), array $server = array())
{
/* @var $client Symfony\Component\BrowserKit\Client */
$client = $this->createClient($options, $server);
// has to be set otherwise "hasPreviousSession" in Request returns false.
$client->getCookieJar()->set(new Symfony\Component\BrowserKit\Cookie(session_name(), true));
$user = $this->getCurrentUser();
$token = new UsernamePasswordToken($user, null, $firewallName, array('ROLE_ADMIN'));
self::$kernel->getContainer()->get('session')->set('_security_' . $firewallName, serialize($token));
return $client;
}
}
Not working yet, sorry :(
6 comments for "Пара советов по тестированию контроллеров Symfony2"
Oscar B. 2011/11/01 08/34/08 Reply
This was very usefull for me. Thanks a lot, now I know how to get the service container in tests; also the athentication stuff. So great. ;)
gordonslondon 2011/11/15 12/53/49 Reply
Use $this->assertEquals(200, $adminClient->getResponse()->getStatusCode()); instead of $this->assertTrue(200 === $adminClient->getResponse()->getStatusCode());
MikeD 2011/11/17 06/01/15 Reply
This is huge. Thanks a lot for sharing.
Davert 2012/02/13 13/41/38 Reply
You can try http://codeception.com/ to test Symfony2 applications. The same practices for functional testing is implemented in better readable DSL
Vitaly 2012/02/28 11/19/57 Reply
How to use second example in my tests? Should I write smthng like this? "$client = static::createClientWithAuthentication('main');"
Dmitry Bykadorov 2012/02/28 11/27/52 Reply
Hello, Vitaly Since this method defined as not static, you should use $this->createClientWithAuthentication('main');