Comment tester une session

Par lakamark, il y a 9 ans


Bonjour,

Je suis entraine de faire des teste unitaire. Nombreux de ces teste unitaire vont avoir besoin d'une session Utilisateur de connecté. Je sais pas comment tester ça. J'ai essayer une première piste de selution est que je me créer un utilsateur et je met ses informations dans un tableau Auth qui contient l'id et le username dans la fonction setUp() de mon fichier de teste.

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire

public function setUp() { parent::setUp(); Artisan::call('migrate'); $user = factory(User::class)->create(['confirmed' => 1, 'confirmation_token' => NULL]); $response = $this->actingAs($user,'api')->withSession([ 'Auth' => ['id' => $user->id, 'username' => $user->name]])->get('/'); $session = Request::session(); $session->start(); }

À chaque teste j'ai ce tableau Auth qui se créer dans la session :

Illuminate\Session\Store {#622 #id: "XhcZJSogLu5pHq7811K6r3QbfnPrIZUXRFoMEREO" #name: "laravel_session" #attributes: array:4 [ "_token" => "oZ10Wqmxqb24gJtLNecoLRt8Djv9lM0tKm70p23W" "Auth" => array:2 [ "id" => 1 "username" => "Mariana Balistreri MD" ] "_previous" => array:1 [ "url" => "http://localhost" ] "_flash" => array:2 [ "old" => [] "new" => [] ] ] #handler: Symfony\Component\HttpFoundation\Session\Storage\Handler\NullSessionHandler {#608} #started: true }

Dans mes autres fonctions de testlalalala() je récupère les info de la session si le tableau Auth existe

public function testSession() { $session = Request::session(); $user_id = $session->get('Auth.id'); // suite du teste }

J'ai un doute que c'est la bonne techique pour vraiment bien tester une session. J'ai regardé dans la doc de laravel et ça m'a pas donnée une réponse juste : https://laravel.com/docs/5.4/http-tests#session-and-authentication.

Merci de votre aide.

7 réponses

kndeye, il y a 9 ans

Bonjour, pour tester avec une Utilisateur connecté, il faut générer et authentifier un utilisateur avec la méthode actingAs() :

public function testApplication() { // Tu génèresun utilisateur $user = factory(User::class)->create(); // Tu authentifies l'utilisateur et il est dans la session $response = $this->actingAs($user)->get('/') ; }
lakamark, il y a 9 ans

Bonjour,
Une foit que j'ai mis l'utilsateur dans la session Je prend la classe Request::session())? J'ai débug la session et je ne voit pas de tableau avec un utiisateur qui connecté dans la session :

public function testSession() { $user = factory(User::class)->create(['confirmed' => 1, 'confirmation_token' => NULL]); $response = $this->actingAs($user)->get('/') ; $session = Request::session(); dd($session); } Illuminate\Session\Store {#623 #id: "wYIKpp3w316aUR3IgVaYQtYWzs2SjeslzQe2Z9lf" #name: "laravel_session" #attributes: array:3 [ "_token" => "vOePQyJZjaxVecnefqQy6OPHR5qeVXhNqp4Gc636" "_previous" => array:1 [ "url" => "http://localhost" ] "_flash" => array:2 [ "old" => [] "new" => [] ] ] #handler: Symfony\Component\HttpFoundation\Session\Storage\Handler\NullSessionHandler {#611} #started: false }
kndeye, il y a 9 ans

Bonjour, essais de débugguer le Auth::user()

dd(Auth::user());

Je pense pas que le Request::session() ait accès à l'utilisateur connecté

lakamark, il y a 9 ans

J'ai debugguer Auth::user() et ça me retourne ça :

App\User {#615 #fillable: array:6 [ 0 => "name" 1 => "email" 2 => "password" 3 => "confirmation_token" 4 => "ip" 5 => "confirmed" ] #hidden: array:4 [ 0 => "password" 1 => "remember_token" 2 => "email" 3 => "ip" ] #appends: array:2 [ 0 => "email_md5" 1 => "ip_md5" ] #connection: null #table: null #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #perPage: 15 +exists: true +wasRecentlyCreated: true #attributes: array:11 [ "name" => "Mrs. Bernita Ziemann" "email" => "uhansen@example.com" "password" => "$2y$10$3tchfaK/7U9X/aI1XX7pIunnZMvMr9RERgzEaaCuWblWBoq2ITZue" "remember_token" => "fGDvBBqdqJ" "role" => "user" "ip" => "113.81.170.95" "confirmed" => 1 "confirmation_token" => null "updated_at" => "2017-02-25 21:56:13" "created_at" => "2017-02-25 21:56:13" "id" => 1 ] #original: array:11 [ "name" => "Mrs. Bernita Ziemann" "email" => "uhansen@example.com" "password" => "$2y$10$3tchfaK/7U9X/aI1XX7pIunnZMvMr9RERgzEaaCuWblWBoq2ITZue" "remember_token" => "fGDvBBqdqJ" "role" => "user" "ip" => "113.81.170.95" "confirmed" => 1 "confirmation_token" => null "updated_at" => "2017-02-25 21:56:13" "created_at" => "2017-02-25 21:56:13" "id" => 1 ] #casts: [] #dates: [] #dateFormat: null #events: [] #observables: [] #relations: [] #touches: [] +timestamps: true #visible: [] #guarded: array:1 [ 0 => "*" ] #rememberTokenName: "remember_token" }
kndeye, il y a 9 ans

C'est pas ce que tu cherche à faire? Tu as bien le $user connecté là !!

lakamark, il y a 9 ans

Oui et je réupère seulement avec la classe Auth::user() pour faire mes test quand un utilisateur est connecté.

kndeye, il y a 9 ans

Si c'est bon, n'oublies pas de mettre le topic en résolu.