1
1
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Laravel】メソッドインジェクションを利用してRequestを偽装しよう!

Last updated at Posted at 2024-07-17

Laravel v8での話です。化石を使っています。

Laravelでリクエストを受け取ってゴニョゴニョしているメソッドをテストしたいとき、役に立つのがメソッドインジェクションです。
ここでは詳しく話しませんが、「サービスコンテナ」で調べると色々情報が出てきます。

(Laravel8ですが)

今回はこのメソッドインジェクションを利用して、Request::xxx() 系の処理をテストする方法を紹介したいと思います。

Request::root

Request::root()request()->root() の出力は一緒です。

$this->assertEquals(
    request()->root() . "/sample",
    Request::root() . "/sample"
);
# => OK

Request::get

リクエスト偽装の方法として、Request::createを使用します。create するだけでなく、作成したrequestインスタンスをバインドし直して、インスタンスを偽装します。

$request = Request::create('/', 'GET', ['page' => 3]);
$this->app->instance('request', $request);
$this->assertEquals(3, Request::get('page'));
# => OK

以下のような「クエリパラメータの値を参考に前後ページへのリンクタグを生成する」と言ったメソッドのテストに利用できます。

クエリパラメータの値を参考に前後ページへのリンクタグを生成する
function get_pager_link()
{
    $tag = '';
    $current_index = (int)Request::get('page') ?: 1; // <- コイツを偽装したい
    if ($current_index > 1) {
        $tag .= '<link href="'. Request::url() .'?page='. ($current_index - 1) . '" />'. PHP_EOL;
    }

    if ($paginate_object->lastPage() > $current_index) {
        $tag .= '<link href="'. Request::url() .'?page='. ($current_index + 1) . '" />';
    }

    return $tag;
}

public function test_get_pager_link__ページネーションタグ生成テスト()
{
    $request = Request::create('/', 'GET', ['page' => 1]);
    $this->app->instance('request', $request);
    $expectedResult = '<link href="' . Request::root() . '?page=2" />';

    $this->assertEquals($expectedResult, get_pager_link());
    # => OK
}

Request::server

$request = Request::create('/', 'GET', [], [], [], [
     'HTTP_USER_AGENT' => "Mozilla/5.0 (Linux; Android 6.0.1;..."
]);
$this->app->instance('request', $request);
$this->assetEquals(
    "Mozilla/5.0 (Linux; Android 6.0.1;...",
    Request::server('HTTP_USER_AGENT')  // <- コイツを偽装したい
);
# => OK

Request::query

練習でやってみてください。ここまでで説明した内容でできます。

Request::query('utm_source')

$request = Request::create('/', 'GET', ['news' => "smartnews"]);
$this->app->instance('request', $request);
$this->assertEquals("smartnews", Request::query('utm_source'));  // <- コイツを偽装したい
# => OK

Request::ip

IPアドレスの偽装は、REMOTE_ADDR パラメータに値を入れます。

$request = Request::create('/', 'GET', [], [], [], ['REMOTE_ADDR' => '182.161.76.40']);
$this->app->instance('request', $request);
$this->assertEquals('182.161.76.40', Request::ip());  // <- コイツを偽装したい
# => OK
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1