Я тестирую приложение с помощью Symfony Panther. Я хочу войти в систему, чтобы пользователь не предоставил элементы в анонимных условиях. Вот мой тестовый класс:
namespace App\Tests\Functional;
use Symfony\Component\Panther\PantherTestCase;
class SecurityControllerTest extends PantherTestCase
{
public function testConnexion()
{
$client = static::createPantherClient('127.0.0.1', '9001');
$crawler = $client->request('GET', '/connexion');
$form = $crawler->selectButton('Se connecter')->form();
$form['_email'] = '[email protected]';
$form['_password'] = 'password';
$crawler = $client->submit($form);
// $link = $crawler->filter('a:contains("Déconnexion")')->link();
// $crawler = $client->click($link);
$link = $crawler->selectLink('Déconnexion');
$link->click();
$this->assertSame(self::$baseUri.'/', $client->getCurrentURL());
}
}
Связанный шаблон (connexion.html.twig
):
{% extends "layout.html.twig" %}
{% block page_title 'Login' %}
{% block final_javascripts %}
{{ encore_entry_script_tags('sendCredentials') }}
{% endblock %}
{% block content %}
(...)
<div class="row mt-4">
<div class="col-md-6">
<form id="connexion-form" action="{{ path('security_connexion') }}" method="post">
<div class="form-group">
<label for="email">Email</label>
<input type="text" id="email" name="_email" class="form-control">
</div>
<div class="form-group">
<label for="password">Mot de passe</label>
<input type="password" id="password" name="_password" class="form-control">
</div>
<button type="submit" class="btn btn-primary button">Se connecter</button>
</form>
</div>
</div>
</div>
</div></div>
{% endblock %}
И _nav.html.twig
шаблон, представляющий панель навигации:
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="{{ path("index") }}"><img src="{{ asset("images/temporary-logo.png") }}" alt="shinigami-laser-logo" style="max-height: 60px;"></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
(...)
{% if is_granted('IS_AUTHENTICATED_FULLY') %}
{% if is_granted('ROLE_USER') %}
<li>
<a href="{{ path('logged_infos') }}" class="nav-link shogun-link">Mes infos</a>
</li>
<li>
<a href="#" class="nav-link shogun-link">Gerer mes cartes</a>
</li>
<li>
<a href="#" class="nav-link shogun-link">Mes stats</a>
</li>
{% endif %}
<li class="nav-item">
<a class="nav-link shogun-link" href="{{ path('security_deconnexion') }}">Déconnexion</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link shogun-link" href="{{ path('user_enregistrement') }}">S'enregistrer</a>
</li>
<li class="nav-item">
<a class="nav-link shogun-link" href="{{ path('security_connexion') }}">Se connecter</a>
</li>
{% endif %}
</ul>
</div>
</div>
</nav>
В режиме разработки пользователь может пройти аутентификацию и выйти с Déconnexion
ссылка в навигационной панели.
Но команда php bin/phpunit tests/Functional/SecurityControllerTest.php
говорит: InvalidArgumentException: The current node list is empty.
указывая на эту строку: $link->click();
показывая, что Déconnexion
ссылка не видна
Этот пользователь не вошел в систему?
Как это исправить и получить доступ к предоставленным элементам для прошедшего проверку пользователя, например Déconnexion
ссылка на сайт ?
Задача ещё не решена.
Других решений пока нет …