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


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

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 ?