web-dev-qa-db-fra.com

Comment configurer un utilisateur dans des tests unitaires

Je veux tester certaines méthodes dans mon plugin, et certaines d'entre elles nécessitaient que l'utilisateur soit connecté.

J'ai cherché partout mais je n'ai rien trouvé d'utilisation.

Je dois tester une méthode qui prend un jeton de session connecté d'un utilisateur. Pour cela, je dois me moquer de l'utilisateur connecté, puis obtenir son jeton en utilisant wp_get_session_token.

Mais je ne sais pas comment faire ça.

<?php
class Test_Class extends WP_UnitTestCase {

  /**
   * Checks the error for invalid user token
   *
   * @since 1.1.0
   */
  public function test_add_app() {

    $user = $this->factory->user->create();

    wp_set_current_user( 1 );
    $auth_token  = wp_get_session_token();
    $auth_cookie = wp_parse_auth_cookie();

    // I'm checking for validity here but the token seems to be empty
    // so the test fails every time.
  }
}

J'ai lu que je pouvais simuler des données avec l'usine fournie par WP_UnitTestCase, mais je ne suis pas sûr de ce que je fais mal.

4
dingo_d

Juste quelques notes:

On dirait que vous faites des tests fonctionnels/d'intégration plutôt que des tests unitaires isolés.

Ici, vous créez un utilisateur, mais ne le définissez pas comme l'utilisateur actuel:

$user = $this->factory->user->create();
wp_set_current_user( 1 );

Vous voulez probablement:

$user_id = $this->factory->user->create();
wp_set_current_user( $user_id );

Notez que les cookies ne sont pas configurés ici, à cause de:

tests_add_filter( 'send_auth_cookies', '__return_false' );

Si vous utilisez par exemple.

add_filter( 'send_auth_cookies', '__return_true' );

vous obtiendrez alors une erreur lorsque setcookie() est appelé à partir de wp_set_auth_cookie():

Cannot modify header information - headers already sent by (

La wp_get_session_token() est une enveloppe de wp_parse_auth_cookie().

L'analyse d'un cookie avec wp_parse_auth_cookie suppose que $_COOKIE est défini.

Je me demande si une fausse chaîne de jetons fonctionnerait dans vos tests?

Sinon on pourrait essayer:

$expiration = time() + DAY_IN_SECONDS;
$manager    = WP_Session_Tokens::get_instance( $user_id );
$token      = $manager->create( $expiration );

avec une vérification:

$this->manager->verify( $token );

et ensuite un nettoyage:

$this->manager->destroy( $token );
2
birgire