Тестирование в Symfony

По своему личному опыту могу сказать, что писать тесты нужно всегда. Ведь так или иначе программисту приходится как-то тестировать написанный код, а соответвенно тратить время. Но если мы сделали файл с тестом, то мы всегда сможем использовать его в будущем, съекономив кучу времени.

При добавление нового функционала часто могут возникнуть конфликты с уже работающими модулями. Чтобы этого избежать необходимо после интеграции нового модуля проверить функциональность всех старых. А если нет тестов, то это становится очень проблематично и трудозатратно. Поэтому многие просто закрывают на тестирование глаза в надежде что их пронесет и проблем после интеграции не будет.

Тесты дают уверенность в том, что никакие изменения не повлияют на уже написанные части программы.

Давайте перейдем к конкретным примерам

Напишем короткий тест, который будет проверять доступность главной страницы сайта. Создадим файл PagesControllerTest.php в папке tests.

Ознакомиться с проектом целиком можно, склонировав репозиторий https://github.com/symfonyst/rest.git

        
        namespace App\Tests\Controller\Frontend;


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

        class PagesControllerTest extends WebTestCase
        {
            public function testMainPage(){
                $client = self::createClient();
                $client->request("GET", "/");
                $this->assertTrue($client->getResponse()->getStatusCode() == Response::HTTP_OK);
            }
        }
        
    

Когда нужно протестировать методы, доступные только авторизованным пользователям, в тестах необходимо смоделировать процесс авторизации пользователя.

Следующий код наглядно демонстрирует как это можно сделать.

        
        public function createAuthenticatedClient($username, $password){
            $client = static::createClient();
            $client->request(
                'POST',
                '/api/login_check',
                array(),
                array(),
                array('CONTENT_TYPE' => 'application/json'),
                json_encode(array(
                    'username' => $username,
                    'password' => $password,
                ))
            );
            $data = json_decode($client->getResponse()->getContent(), true);
            $client = static::createClient();
            $client->setServerParameter('HTTP_Authorization', sprintf('Bearer %s', $data['token']));
            return $client;
        }
        
    

Далее мы можем использовать данный клиент для запроса закрытых методов и их тестирования.