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
Réponse acceptée

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

dd(Auth::user());

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

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
Auteur

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
}
lakamark
Auteur

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"
}

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

lakamark
Auteur

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

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