Call to a member function user

Par Yaacov Krief, il y a 5 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.
Je suis sur le cours
[https://www.grafikart.fr/tutoriels/test-auth-php-phpunit-1184]

Exercice : Pratiquons les tests

Le fichier est AuthTest.php

<?php use PDO; use App\Auth; use PHPUnit\Framework\TestCase; use App\Exception\ForbiddenException; class AuthTest extends TestCase{ /** * @var Auth */ private $auth; /** * @before */ private $session = []; // pour éviter de copier à chaque fois le même code de PDO avec connexion et creation on créé une méthode setAuth public function setAuth (){ //sqlite::memory = db virtuelle pas besoin de tester sur la vraie DB $pdo = new PDO("sqlite::memory:", null, null, [ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]);// on a une nouvelle instance de PDO donc on va créer une table avec des utilisateurs $pdo->query('CREATE TABLE users (id INTEGER, username TEXT, password TEXT, role TEXT)'); for ($i = 1; $i < 10; $i++){ // avant d'insérer un password il faut le hacher $password = password_hash("user$i", PASSWORD_BCRYPT); // on rempli la base $pdo->query("INSERT INTO users (id, username, password, role) VALUES ($i, 'user$i', '$password', 'user$i')"); } $this->auth = new Auth($pdo, "/login", $this->session); // on donne les éléments de connexion pour les tests } public function testLoginWithBadUsername (){ // on essaye de se connecter en donnant un mauvais mot de passe, on devrait avoir un true à l'assertNull $this->assertNull($this->auth->login('aze', 'aze')); } public function testLoginWithBadPassword (){ // on essaye de se connecter en donnant un mauvais mot de passe, on devrait avoir un true à l'assertNull $this->assertNull($this->auth->login('user1', 'aze')); } public function testLoginSuccess (){ // on essaye de se connecter en donnant un mauvais mot de passe, on devrait avoir un true à l'assertNull $this->assertObjectHasAttribute("username", $this->auth->login('user1', 'user1')); $this->assertEquals(1, $this->session['auth']); } public function testUserWhenNotConnected () { $this->assertNull($this->auth->user()); } public function testUserWhenConnectedWithUnexitingUser () { $this->session['auth'] = 11; $this->assertNull($this->auth->user()); } public function testUserWhenConnected () { $this->session['auth'] = 4; $user = $this->auth->user(); $this->assertIsObject($user); $this->assertEquals("user4", $user->username); } public function testRequireRole () { $this->session['auth'] = 2; $this->auth->requireRole('user2'); $this->expectNotToPerformAssertions(); } public function testRequireRoleWithoutLoginThrowException () { $this->expectException(ForbiddenException::class); $this->auth->requireRole('user3'); } public function testRequireRoleThrowException () { $this->expectException(ForbiddenException::class); $this->session['auth'] = 2; $this->auth->requireRole('user3'); } } ?>

après chaque test j'obtiens une erreur

Error: Call to a member function login() on null
Ou
Error: Call to a member function user() on null

quelqu'un aurait une idée ou a eu le même problème?

Merci

2 réponses

Yaacov Krief, il y a 5 ans

Bonjour et merci pour la réponse mais oui il a bien été initialisé

Soundboy39, il y a 5 ans

Bonjour,

Humm... excuse moi mais je suis quand même un peu sceptique sur le fait que l'objet "auth" soit bien initialisé...
est-ce que tu la vérifié via un var_dump ? est-ce que tu est sur que setAuth est bien appelée au moins une fois ?
est-ce qu'il n'y a pas une erreur au niveau de l'instanciation ?