Тестирование в 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;
}
Далее мы можем использовать данный клиент для запроса закрытых методов и их тестирования.