web-dev-qa-db-ja.com

ユニットテスト内にユーザーを設定する方法

私は自分のプラグインでいくつかのメソッドをテストしたいのですが、そのうちのいくつかはユーザーがログインすることを要求しました。

私はいたるところを捜したが何の役にも立たなかった。

ユーザーからログインしたセッショントークンを取り込むメソッドをテストする必要があります。そのためには、ログに記録されたユーザーをモックしてからwp_get_session_tokenを使用して彼のトークンを取得する必要があります。

しかし、その方法がわかりません。

<?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.
  }
}

WP_UnitTestCaseで提供されているファクトリでデータをモックできると読んだことがありますが、何が悪いのかわからないです。

4
dingo_d

ほんの少しのメモ:

単体テストではなく、機能/統合テストを行っているようです。

ここではユーザーを作成していますが、現在のユーザーとして設定していません。

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

あなたはおそらく欲しい:

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

次の理由により、Cookieはここで設定されていません。

tests_add_filter( 'send_auth_cookies', '__return_false' );

あなたが使用する場合.

add_filter( 'send_auth_cookies', '__return_true' );

setcookie()wp_set_auth_cookie()から呼び出されるとエラーになります。

Cannot modify header information - headers already sent by (

wp_get_session_token()wp_parse_auth_cookie()のラッパーです。

wp_parse_auth_cookieでクッキーを解析することは、$_COOKIEが設定されていることを前提としています。

偽のトークン文字列があなたのテストでうまくいくだろうか?

そうでなければ、試すことができます:

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

検証あり

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

その後、クリーンアップ:

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